顶点着色器
在管线中的位置:1号(这图作的跟病毒似的)
可以替代下面这些传统的操作:
- 顶点变换
- 法线变化及规范化
- 纹理坐标生成
- 纹理坐标变换
- 光照
- 彩色材质应用
顶点着色器可以用来指定一系列完全通用的、并将应用于各个顶点及相关数据上的操作。理解这点很重要。
顶点着色器不会取代一次需要多个顶点的情况或者需要拓扑情况的图像操作。
顶点着色器数据的输入与输出:
属性变量(ATTRIBUTE VARIABLES):在顶点着色器中定义的变量可能被限定为“属性变量”。这些变量代表了非常频繁的从应用程序传递到顶点处理器的值。
属性变量有两种:内置和自定义的。内置的如:gl_Color、gl_Normal和gl_Vertex等。
一致变量(UNIFORM VARIABLES):用来将数据值从应用程序传递到顶点处理器或片元处理器。它可以作为着色器的形参。
一致变量有两种:内置的和自定义的。内置的以gl_开头的可以用来访问当前的OpenGL状态。
特殊的输出变量:gl_Position(顶点坐标在裁剪空间中的位置),这个是必须要输出的。
易变量:(VARYING VARIABLES):从顶点处理器传递数据到片元处理器。顶点着色器可以使用用户自定义的易变量向片元着色器传递任何需要执行插值的数据:颜色、法线(对于各个片元的光照计算非常有用)、纹理坐标、模型坐标和其他任 意值。
易变量有两种:内置的和自定义的。内置的易变量包括为标准的OpenGL颜色以及纹理坐标值定义的变量。
顶点处理器的输出(特殊的输出变量以及用户自定义的和内置的易变量)将被发送到后续的处理阶段。
片元着色器
在第一幅图的2号位置。
可替代一下传统的操作:
- 在插值得到的值上的操作
- 纹理访问
- 应用纹理
- 雾化
- 颜色汇总
还可以执行各种各样的计算。片元着色器不能更改片元的x/y的位置。片元着色器不会取代同时需要几个片元的情况的图形操作。片元着色器不会取代在OpenGL像素处理管道的后端发生的固定功能操作,例如:覆盖、像素所有权测试、剪切、电话、alpha测试、深度测试、模板测试、alpha混合、逻辑操作、抖动和平面遮蔽等。
片元着色器的数据输入与输出:
片元着色器的一大优点是可以任意多次的访问纹理内存,并可以任意方式结合所读取的值。片元着色器可以随意的从一个单独的纹理着色器读取多个值或从多个纹理中读取多个值。一次纹理访问的结果和可以作为另一次纹理访问的基础(及从属纹理读取,DEPENDENT TEXTURE READ)。这种从属读取可能的数量没什么固有的限制。因此可以在片元着色器中实现管线衍射算法。
对于各个片元来说,片元着色器可以计算颜色和深度(这些值可以写入特殊的输出变量gl_FragColor和gl_FragDepth)或者完全丢弃片元。