本篇介绍 shader language 的基本原理和运行流程
shader lab 初步了解
-
1
shader language 被定位为高级语言,如,GLSL 的全称是“High Level Shading Language”,Cg 语言的全称为“C for Graphic”,并且这两种 shader language 的语 法设计非常类似于 C 语言。不过高级语言的一个重要特性是“独立于硬件”,在这 一方面 shader language 暂时还做不到,shader language 完全依赖于 GPU 构架,这一特征在现阶段是非常明显的!任意一种 shader language 都必须基于图形硬 件,所以 GPU 编程技术的发展本质上还是图形硬件的发展。在 shader language存在之前,展示基于图形硬件的编程能力只能靠低级的汇编语言。 -
2
Shader language 目前主 要有 3 种语言:基于 OpenGL 的 GLSL,基于 Direct3D 的 HLSL,还有 NVIDIA公司的 Cg 语言。 -
3
Programmable Vertex Processor 可编程顶点处理器又称为顶点着色器
Programmable Fragment Processor 可编程片段处理器,又称为片段着色器
END
百度经验:jingyan.baidu.com
shader Language 原理
-
1
顶点和片段处理器被分离成可编程单元,可编程顶点处理 器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行 片段程序的单元。 -
2
顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于 4 阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还 不行,这是顶点处理器的一个发展方向)。 -
3
顶点程序运行在顶点处理器上,片段程序运行在片段处理器上,那么他们究竟控制了GPU渲染的那个过程。下图为可编程图形渲染管线
-
4
各自的分工:
从上表我们可以看出,
顶点着色程序负责顶点坐标变换;
片段程序负责像素颜色计算
前者的输出是后者的输入。 -
5
输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;
纹理buffer存放纹理数据 Tip:目前大多数的可编程图形硬件只支持片段处理器处理纹理;
从外部输入的常量最好放在常量寄存器中;
临时寄存器存放着色程序在执行过程中产生的临时数据。
END
Vertex Shader Program
-
1
顶点着色程序从 GPU 前端模块(寄存器)中提取图元信息(顶点位置、法 向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等 操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需 要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传 递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送 光栅操作模块。 -
2
在应用程序中设 定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到 vertex buffer 中;纹 理信息传递到 texture buffer 中。其中虚线表示目前还没有实现的数据传递。当前 的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。 -
3
顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为 后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如,输入一个三角面片,顶点着色程序对其进行 phong 光照计算,只计算三个顶点的 光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand 明暗处理或 者快速 phong 明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较 好(快速 phong 明暗处理),则效果也会较好;如果图形硬件使用 Gourand 明暗 处理算法,则会出现马赫带效应(条带化)。
而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,不但可控性好,而且可以达到更好的效果。
由于 GPU 对数据进行并行处理,所以每个数据都会执行一次 shader 程序程 序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。
END
Fragment Shader Program
-
1
片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。 -
2
片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于 GPU 而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一 个研究方向。 -
3
Tips:
什么是片断?片断和像素有什么不一样?所谓片断就是所有的三维顶点 在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素 都是经过深度比较的。
END
注意事项
- 目前大多数的可编程图形硬件只支持片段处理器处理纹理;
- 顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为 后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。
- 片段着色程序还有一个突出的特点是:拥有检索纹理的能力。