3一个简单的Shader
程序员文章站
2024-03-23 08:24:01
...
格式
一个简单的UnityShader看起来是这样:
CG代码段 : 由CGPROGRAM
与ENDCG
包围起来
编译指令 这里的用来告诉Unity, 什么是顶点着色器,什么是片元着色器
#pragma vertex 顶点着色器函数名
#pragma fragment 片元着色器的函数名
模型数据怎么进入Shader的?
在调用DrawCall的时候, MeshRender组件会把它负责渲染的模型数据 传给 UnityShader
属性
在CG代码中, 声明一个与 Properties 下 同名,同类型 的变量即可.
也可以看作, Properties 中的语句是 对CG代码中的同名变量做了一个初始化
类型对应关系如下:
语义
为输入变量指定从什么 地方拿数据, 或者为输出变量指定往什么地方输出数据.
一般的语义 是没有特别含义的, 存储什么都可以
系统数值语义 会存储渲染流水线中用的的变量, 不可以随便用
Unity支持的有特殊含义的语义 Unity会用的变量, 不可以随便用,如下:
包含文件
以 .cginc 结尾. 在CG代码段中如下进行包含:
#include "名字"
UnityCG.cginc : 有一些常用的结构, 函数, 宏.
UnityShaderVariables.cginc : 自动包含, 有前面说过的全局变量
Debug
- Visual Studio 插件 Graphic Debugger
- Unity 窗口 Frame Debugger
建议
- float > half > fixed(-2到+2之间). 尽量用低精度
- 减少Shader中的计算量, 不然寄存器可能会不够
- 通过修改 Shader Target 可以假设有更多的寄存器可用. OpenGL平台当作支持3.0, WP8/WinRT 平台 只支持 2.0
- 慎用分支和循环, 《GPU精粹2》 GPU流程控制 一章讲了更多
- 不要除以0
上一篇: 9.4 使用java操作hadoop
下一篇: Java-通过URL来调用WebAPI