CG编程学习(二)
什么是输入输出与语义?
in ,out , inout:表示函数的输入参数的传递方式。uniform,用于指定变量数据的初始化方式。const ,用于指定修饰的变量为常量变量。
CG语言将输入数据流分为两类:Varying inputs 和 Uniform 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。
文章图片
输入语义词 顶点着色程序的输出语义:
顶点程序的输出数据被传入到片段程序中,所以顶点着色程序的输出语义词,通常也是片段程序的输入语义词,不过语义词POSITION除外。
POSITION、COLOR0-COLOR1、PSIZE、FOG、TEXCOORD0-TEXCOORD7适用于所有的顶点输出语义和片段输入语义。
顶点着色程序必须申明一个输出变量,并绑定POSITION语义,该变量中的数据将被用于且只能被用于光栅化。如果没有申明一个绑定了POSITION语义词的输出变量,编译会出错。为了保持顶点程序输出语义和片段程序输入语义的一致性,通常使用相同的struct类型数据作为两者之间的传递。
片段程序的输出语义:
片段程序的输出语义词比较少,通常只有COLOR。这是因为片段程序运行完毕基本就到了GPU流水线的末端了。片段程序必须申明一个out向量并绑定COLOR语义,这个值将被作为该片段的最终颜色值。
语义绑定方法:
入口函数输入输出数据的绑定有4种方法:
1绑定语义放在函数参数列表的参数申明后面
文章图片
放在参数申明后面 2绑定语义词可以放在结构体成员的后面
文章图片
放在结构体成员后面 3绑定语义放在函数申明的后面
文章图片
放在函数的后面 4将绑定语义放在全局非静态变量申明的后面。
这种形式很少用到。
【CG编程学习(二)】在unity中,填充到POSITION,NORMAL这些语义的数据是从哪里来的呢?它们是由使用这个Shader的MeshRender组建提供的。在每帧调用DrawCall时,MeshRender组建会把它负责渲染的模型数据发送给Shader,在Shader中可以通过顶点着色器访问这些数据并做出相应变换处理。
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚
- 由浅入深理解AOP
- 一百二十三夜,请嫁给我
- 迷失的世界(二十七)
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息