CG编程学习(二)

什么是输入输出与语义?

in ,out , inout:表示函数的输入参数的传递方式。uniform,用于指定变量数据的初始化方式。const ,用于指定修饰的变量为常量变量。


CG语言将输入数据流分为两类:Varying inputsUniform inputs前者表示数据流输入图元信息的各种组成要素,从应用程序到GPU的数据,除了顶点位置数据,还有顶点的法向量数据,纹理坐标数据等。CG提供了一组语义词来表明参数是由顶点的哪些数据初始化的。后者表示一些与三维渲染有关的离散信息数据,这些数据通常由应用程序传入,通常不会随图元的信息变化而变化。如材质对光的反射信息,运动矩阵等。in修饰一个形参只用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参的值,这是典型的值传递。out修饰一个形参只用于输出,进入函数体时并没有被初始化,这种类型的形参一般是一个函数的运行结果。inout修饰形参既用于输入也用于输出,这是典型的引用传递。


语义是两个处理阶段(顶点程序和片段程序)输入输出数据和寄存器之间的桥梁,同时语义还表示数据的含义,如POSITION一般表示参数中存放的数据是顶点位置。语义只对两个处理阶段的输入输出数据有意义,也就是说语义只有在入口函数中才有效,在内部函数(一个阶段的内部处理函数,和下个阶段没有数据传递关系)无效,被忽略。


顶点着色程序的输入语义:

POSITION:顶点位置坐标(通常在模型空间中),在OpenGL中对应为接受应用程序传递的顶点数据的寄存器。(四元向量)

但DX10之后就推荐使用SV_POSITION作为vertex shader的输出和fragment shader的输入了,注意vertex shader的输入还是使用POSITION!切记。

但是DX10以后的代码依旧兼容POSITION作为全程表达,估计编译器会自动判断并替换的吧。

NORMAL:顶点法向量坐标(通常位于模型空间中),在OpenGL中对应位接受应用程序传递的法向量数据的寄存器。(四元向量)

TANGENT、BINORMAL、PSIZE、BLENDWEIGHT、BLENDINDICES、TEXCOORD0、TEXCOORD1、TEXCOORD2、TEXCOORD3、TEXCOORD4、TEXCOORD5、TEXCOORD6、TEXCOORD7。

CG编程学习(二)_第1张图片
输入语义词

顶点着色程序的输出语义:

顶点程序的输出数据被传入到片段程序中,所以顶点着色程序的输出语义词,通常也是片段程序的输入语义词,不过语义词POSITION除外。

POSITION、COLOR0-COLOR1、PSIZE、FOG、TEXCOORD0-TEXCOORD7适用于所有的顶点输出语义和片段输入语义。

顶点着色程序必须申明一个输出变量,并绑定POSITION语义,该变量中的数据将被用于且只能被用于光栅化。如果没有申明一个绑定了POSITION语义词的输出变量,编译会出错。为了保持顶点程序输出语义和片段程序输入语义的一致性,通常使用相同的struct类型数据作为两者之间的传递。


片段程序的输出语义:

片段程序的输出语义词比较少,通常只有COLOR。这是因为片段程序运行完毕基本就到了GPU流水线的末端了。片段程序必须申明一个out向量并绑定COLOR语义,这个值将被作为该片段的最终颜色值。


语义绑定方法:

入口函数输入输出数据的绑定有4种方法:

1绑定语义放在函数参数列表的参数申明后面

CG编程学习(二)_第2张图片
放在参数申明后面

2绑定语义词可以放在结构体成员的后面

CG编程学习(二)_第3张图片
放在结构体成员后面

3绑定语义放在函数申明的后面

CG编程学习(二)_第4张图片
放在函数的后面

4将绑定语义放在全局非静态变量申明的后面。

这种形式很少用到。

在unity中,填充到POSITION,NORMAL这些语义的数据是从哪里来的呢?它们是由使用这个Shader的MeshRender组建提供的。在每帧调用DrawCall时,MeshRender组建会把它负责渲染的模型数据发送给Shader,在Shader中可以通过顶点着色器访问这些数据并做出相应变换处理。

你可能感兴趣的:(CG编程学习(二))