shader与cg简介

来源:互联网 发布:软件销售代理商 编辑:程序博客网 时间:2024/05/01 14:58

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并不难理解,剩下的,就要交给数学和想象力了。

原创粉丝点击