HLSL 着色器编写和原理总结

一般编写过程

首先是编写着色器文本文件,保存为.vsh或.psh或.fx的文本文件

下面是“myVS.vsh”文本文件内容:

//全局变量,全局变量可以看成是显卡的一块内存区域(其实本质是显卡中的常量寄存器或纹理寄存器等特殊的寄存器)

float 4*4 matWorldViewProj; //自动对应于(存放于)一个常量寄存器

float4 materialAmbient; //全局变量可以通过c++的一个常量表接口给这里的全局变量赋值

 

//输出结构

struct VS_OUTPUT    //HLSL复杂数据类型里面包括结构体类型,也可以理解为HLSL支持的一种让用户定义类型

{

      float4 Pos:POSITION; //语义,表示这个结构体的这个成语绑定到显卡的“顶点着色器输出缓冲器”的位置寄存器处

      float4 Color: COLOR;

}

//顶点着色器函数

VS_OUTPUT VS(float4 Pos: POSITION)  //形参Pos的语义说明,这个形参就是显卡的“顶点缓存区”的位置数据处。注意顶点缓冲器一般有c++代码填充

{

       VS_OUTPUT Out=(VS_OUTPUT)0; //显卡流处理器内部定义一个临时变量Out

       Out.Pos=mul(Pos,matWorldViewProj);

 

       float4 AmbientColor={1.0f,1.0f,1.0f,1.0f}; //显卡流处理器内部定义一个临时变量AmbientColor

       float AmbientIntensity=0.5 //流处理器内部一个临时变量

       Out.Color=AmbientIntensity*AmbientColor*materialAmbient; //流处理器内部的运算器进行运算

       return Out; //经return后临时变量Out中的所有值自动输出到结构体语义对应的“顶点着色器输出寄存器”中,比如位置数据到位置寄存器中,便于像素着色器直接取用。

}

 

下面是“myPS.psh”文本文件内容:

 //全局变量,一个2D纹理采样器类型的变量

Sampler s_2D=sampler_state //纹理采样器实例的构造用sampler_state 内部函数

{

    minfilter=LINEAR;

    maxfilter=LINEAR;

};

//输入结构体

struct PS_INPUT

{

    float2 tex: TEXCOORD0; //绑定到“顶点着色器的输出寄存器”的纹理0处。顶点着色器的输出寄存器就是像素着色器的输入寄存器

}

//输出结构体

struct PS_OUTPUT

{

    float4 Color: COLOR; //绑定到“像素着色器的输出寄存器”。以后直接写到后台缓存进行渲染。如果Color是个数组可以表示渲染到多个目标,如渲染到纹理等

}

//像素着色器主函数

PS_OOUTPUT PS(PS_INPUT psInput) 

//一定要注意形参psInput不是函数PS的内部临时变量,其实它是个寄存器,这个和c语义不一样,所以一般只从它那里读数据,不能写数据,而且不能return它。

{

    PS_OUTPUT Out_ps=(PS_OUTPUT)0; //初始化临时变量

    Out_ps.Color=tex2D(s_2D,psInput.tex); //计算出某个纹理颜色赋给临时变量的Color元素,具体的纹理图片在c++中定义并已经放在了显卡中了

    return Out_ps; //通过return语句让临时结构体变量更加元素语义自动输出值到对应的“像素着色器输出寄存器”。一般只能return临时变量。

}

你可能感兴趣的:(HLSL 着色器编写和原理总结)