欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3一个简单的Shader

程序员文章站 2024-03-23 08:24:01
...

格式

一个简单的UnityShader看起来是这样:
3一个简单的Shader
CG代码段 : 由CGPROGRAMENDCG包围起来
编译指令 这里的用来告诉Unity, 什么是顶点着色器,什么是片元着色器

#pragma vertex 顶点着色器函数名
#pragma fragment 片元着色器的函数名

模型数据怎么进入Shader的?

在调用DrawCall的时候, MeshRender组件会把它负责渲染的模型数据 传给 UnityShader

属性

在CG代码中, 声明一个与 Properties 下 同名,同类型 的变量即可.
也可以看作, Properties 中的语句是 对CG代码中的同名变量做了一个初始化
类型对应关系如下:
3一个简单的Shader

语义

为输入变量指定从什么 地方拿数据, 或者为输出变量指定往什么地方输出数据.
一般的语义 是没有特别含义的, 存储什么都可以
系统数值语义 会存储渲染流水线中用的的变量, 不可以随便用
Unity支持的有特殊含义的语义 Unity会用的变量, 不可以随便用,如下:
3一个简单的Shader

包含文件

.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.03一个简单的Shader
  • 慎用分支和循环, 《GPU精粹2》 GPU流程控制 一章讲了更多
  • 不要除以0