| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> cocos creator | 为什么 shader 效果在编辑器中显示正常,运行后却显示异常? 合图纹理的uv计算 -> 正文阅读 |
|
[游戏开发]cocos creator | 为什么 shader 效果在编辑器中显示正常,运行后却显示异常? 合图纹理的uv计算 |
获取源码,请关注公众号: ? 感谢QQ群(521643513)内?honmono?大佬的指导 01 uv 坐标 之后的文章中,我们再详细介绍顶点着色器,片段着色器,纹理等知识 这里简单了解下基本概念 渲染流程: 我们传递给顶点着色器每个顶点坐标及其对应的纹理坐标和纹理颜色后,顶点着色器经过顶点变换,图元装配(将顶点根据原始的连接关系还原成网格结构),光栅化(通过对顶点数据进行插值,获得三角形所覆盖的像素区域)等操作后,得到片元序列(二维图像上每个点都包含了颜色、深度和纹理数据,将该点和相关信息叫做一个片元),然后将片元传递给片元着色器,它会为每个片元进行纹理采样,颜色填充等操作 其中纹理坐标即?uv 坐标 uv 坐标是纹理尺寸的的百分比坐标 在 cocos 中,uv 坐标的原点在左上角,u 轴向右,v 轴向下,范围是 0-1 02 效果对比 demo 中用了两个 shader,分别是水波和圆角 在编辑器中的表现正常: 而运行后,在浏览器中的表现却不是我们预期的效果 小羊的水波效果边缘出现了其他纹理 小天使的圆角效果只有左上角实现了,但被放大了好多倍 03 原因分析 为了降低?DrawCall,cocos 提供了两种合图机制 ·?自动合图(Auto Atlas) 在项目构建时的静态合图方法 ·?动态合图(Dynamic Atlas) 在项目运行时动态的将贴图合并到一张大贴图中 当渲染一张贴图的时候,动态合图系统会自动检测这张贴图是否已经被合并到了图集(图片集合)中,如果没有,并且此贴图又符合动态合图的条件,就会将此贴图合并到图集中 动态合图是按照 渲染顺序 来选取要将哪些贴图合并到一张大图中的,这样就能确保相邻的 DrawCall 能合并为一个 DrawCall(又称“合批”) 也就是说,合图后,该纹理会被放到一个较大的纹理中: 运行时,cocos 会将合图后的纹理传递给 shader,即 shader 中 texture:
同时 cocos?也会帮我们重新计算该纹理在合图纹理中的 uv 坐标,然后将此 uv 坐标传递给 shader,即?shader?中的?v_uv0:
shader 中使用?v_uv0 参与计算的公式,因为?v_uv0 的改变,计算结果也会随之改变,所以,在运行后,我们看到的效果就和在编辑器中不一致了 举个例子 对椰子头来说,假如合图前传入的?uv 坐标为(0.0, 0.0),即纹理的左上角,而经过合图后,椰子头左上角的 uv 坐标就会变成(0.3, 0.0),即为合图中的纹理的 uv 坐标 计算 uv 坐标的相关源码在 CCSpriteAtlas.js 中: 源码路径: resources\engine\cocos2d\core\assets\CCSpriteFrame.js _calculateUV:
经过?_calculateUV() 计算后,SpriteFrame 的 uv 存放的便是该纹理在合图纹理中的 uv 坐标 04 解决方案 1关闭动态合图 通过代码关闭动态合图功能,相应的,可能会增加?DrawCall
2禁止贴图参与合图 在纹理的属性便面中关闭 Packable(是否允许贴图参与合图),依然可能会增加?DrawCall 3动态计算 通过之前的源码,我们可以得知纹理在合图中的四个边界 uv 坐标,通过四个边界坐标,可以计算出归一化的 uv 坐标 在脚本组件中获取纹理的边界?uv 坐标及旋转状态,传递给 shader
在 shader 的片元着色器中,通过当前的 uv 坐标(v_uv0)与纹理在合图中的偏移坐标,计算出归一化后的 uv 坐标
uvNormalize 即为归一化的 uv 坐标,也就是纹理在合图前的 uv 坐标 使用该坐标完成 shader 中对纹理坐标的 计算 但当获取纹理的色值时,依然需要使用 v_uv0,因为 shader 中的纹理(texture)为合图纹理,v_uv0 才是该纹理在合图纹理中正确的?uv?坐标 源码获取,请在公众号回复: 合图 uv 坐标 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/5 21:49:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |