1.what? shader?
shader的定义,需要从显卡的渲染管线开始说起。
渲染管线是显卡内部处理图形信号相互独立的的并行处理单元。我们把顶点位置、法线、纹理坐标等数据参数提供出来,然后再定义光源,通过渲染管线,就可以得到一幅渲染出来的画面。早期的渲染管线只有固定渲染管线:即在提供给GPU待绘制的模型单元之后,程序的设计者是无法干预渲染过程的。后来,显卡商将可编程特性引入到了渲染管线中————可编程渲染管线。使得开发者可以通过自己编写一段小程序运行于GPU来控制具体的渲染过程。而这编写的程序,就是Shader。
Shader分为两种:
vertex shader————顶点级shader,在此处program可以改变模型整体的画面效果(如顶点位置可以改变形状,顶点法向量可以改变光照效果)。
fragment shader(pixel shader dx)————像素级shader,在此处program会控制对应像素点的颜色。

(from cg tutorial)
注:
1.
Vertex Shader/Fragment Shader在运行时,只能对应单一顶点/像素的数据,即被分配到的顶点/像素
2.shader中的随机一般通过设置一张噪音纹理来实现
2.what? cg?
C for graphics,by nvidia公司,一种高级着色语言,both for dx & opengl。
hello vertex shader
(from cg tutorial)
:
struct Output {
float4 position : POSITION; float4 color : COLOR; }; Output vert(float2 position : POSITION, uniform float4 constantColor) { Output OUT; OUT.position = float4(position, 0, 1); OUT.color = constantColor; // Some RGBA color return OUT;
}
semantic:标识变量的用途(如一组float4 用于位置而另一组float4同于法向量),而输入和输出的semantic有不同的意义
函数vert会根据semantic: POSITION,在data stream取得顶点对应的position用于vextex shader,而返回的OUT,会在fragment shader时作为输入。
hello fragment shader (from cg tutorial):
struct Frag_Output { float4 color : COLOR; };
Frag_Output frag(float4 color : COLOR) { Frag_Output OUT;
OUT.color = color; return OUT; }
函数frag将会将该像素的颜色设为其对应的顶点的Output中的COLOR。
————一个vertex shader程序,必须返回一个位置信息,可以返回颜色,uv,或其他与顶点相关的信息。而一个fragment shader,必须把所有的信息最终浓缩为一个颜色返回给GPU。(In some advanced profiles, fragment programs can write additional data such as a depth value as well.)
其实shader program并不难理解,剩下的,就要交给数学和想象力了。