一般编写过程
首先是编写着色器文本文件,保存为.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临时变量。
}