UnityShader8:编写Shader时需要注意的细节和可能需要的意外/BUG

此文章实时更新

一、FrameDebug 帧调试器

Window → Frame Debugger → 打开后如下:

帧调试器可以在游戏运行时冻结当前帧,以查看当前图像是怎么一步步渲染出来的

  1. 开启帧调试
  2. 目前已执行到的对应渲染事件,可以从 Game 视图看到其对应渲染效果
  3. 当前帧所有渲染事件

渲染事件非常的全面,其中 Draw 开头的就是 DrawCall,可以确定其对应的 GameObject,对应的渲染纹理也会显示在 Game 视图中

一、注意事项

1):平台渲染差异

当在 DirectX 平台上使用渲染到纹理技术时,Unity 会自动为我们翻转屏幕图像纹理,所以大部分情况下我们都不需要关系在意纹理翻转问题,但是有特殊情况:一个例子就是开启抗锯齿后再对得到的渲染纹理进行后处理时,这些图像在竖直方向的朝向就可能是不同的,这个估计在后面的学习中才会遇到

2):平台语法差异:

还记不记得,在 OpenGL 中,我们可以用 float4 v = float(0.0) 这样的,仅提供一个参数来初始化4分量数据,但是这在异常严格的 DirectX 9/11 中是不被允许的,这就会导致同样的代码换个平台的就报错了,除此之外还有语义差异等等

不过还好,这种都可以通过搜索报错原因找到问题和解决方法

3):精度范围:

目前出现了2个之前不是特别熟悉的属性类型:half 和 fixed:其实它们也是浮点数,只不过精度上有差:

  • float 32位;half 16位,能表示 ±60000 左右的数,精度为 1/1024;fixed 11位,能表示 ±2 左右的数,精度为 1/256
  • 但,大多数电脑显卡,3者是等价的,都会按照 float 精度算、其次大多数现代显卡,后两者是等价的,fixed 同等与 half 的精度

因此也可以得出一些结论:如果单纯是电脑游戏就不用考虑这么多,但如果是移动平台游戏,就需要在移动平台上测试 Shader,不然电脑上都当成 float 了就不好暴露问题

除了单位矢量和颜色,其它也没必要也不能用 fixed

4):着色器中少用 if 和 while 等流程控制语句

GPU 使用了不同于 CPU 的技术来实现分支语句,在最坏的情况下花在单个分支语句的时间相当于运行了所有分支语句的时间

5):Unity 支持的 ShaderTarget

可以参考:https://blog.csdn.net/linjf520/article/details/94378653

不同的 ShaderTarget、 不同的着色器阶段,可使用的临时寄存器和指令数目都是不同的,如果在 Shader 中进行了过多的运算,那么就会收到错误提示

三、奇奇怪怪的报错 / BUG / 疑难杂症

持续更新

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/110231404