使用HLSL语言编写顶点着色器和像素着色器,
顶点着色器和像素着色器本质使我们自己编写的定制程序,这些程序可以帮助我们取代功能流水线中的某一块功能,
然后在图形卡的GPU中执行。
通过这种变换,我们在实现图像效果的时候就有了更大的的灵活性。
HLSL着色器程序可以以一个长字符串的形式出现在程序的源文件中,但是更模块化的做法是将着色器的代码和
源程序的代码分离。
龙书上面介绍是可以将着色器代码在记事本中编辑,然后保存为常规的ASCII文件,我是不太明白,感觉有点蒙,
但是还是先这么来吧
下面这个HLSL程序是将输入顶点变换之后加上颜色然后输出
//
//
//Desc: 顶点着色器,通过视图和投影变换转换顶点,并将顶点颜色设置为蓝色。
///
//
//用于存储组合视图和投影变换矩阵的全局变量。 我们从应用程序初始化此变量。
/*
该变量类型为matrix,这个类型是HLSL中的内置类型,表示维度为4×4的矩阵
取景变换矩阵:就是将观察坐标系转换到世界坐标系的矩阵
ViewProjMatrix矩阵就是取景变换矩阵和投影变换矩阵的乘积
主要有:在着色器的源代码中是找不到这些变量的初始化的源代码的,因为这些变量的初始化应该在应用程序的源代码中进行
应用程序与着色器程序之间要进行数据通信。
*/
matrix ViewProjMatrix;
//vector也是一个HLSL内置类型,表示一个4D向量,我们只是将他看作RGBA颜色向量,并将其初始化为蓝色
vector Blue={0.0f,0.0f,1.0f,1.0f);
//输入结构描述输入到着色器的顶点。 这里输入顶点仅包含位置分量。
struct VS_INPUT
{
//POSITION 是一种类似于顶点灵活格式的语法,POSITION是用来说明:变量position是描述顶点位置的
vector position: POSITION;
};
//输出结构描述从着色器输出的顶点。 这里输出顶点包含位置和颜色分量。
struct VS_oUTPUT
{
vector position: POSITION;
//COLOR是用来说明:变量diffus是描述颜色的
vector diffuse: COLOR;
);
//主入口点,观察主函数通过其参数接收输入顶点的副本,并返回它计算的输出顶点的副本。
VS_oUTPUT Main(VS_INPUT input)
{
//将输出结构体的各个成员初始化为0
VS_oUTPUT output=(VS_OUTPUT)0;
//将输入结构 的位置和矩阵相乘,然后将变换之后的点赋值给输出结构里面的位置成员
output.position =mul(input.position,ViewProjMatrix);
//将顶点漫反射颜色更改为蓝色
output.diffuse=Blue;
return output;
}
HLSL语法建立了变量和硬件寄存器之间的联系,输入变量总是和输入寄存器相关联,输出变量总是和输出寄存器相关联。
就像刚才的顶点输入结构,VS_INPUT里面的成员position,将会被连接到一个特殊的顶点输入位置寄存器,
同样的VS_OUTPUT里面的成员diffuse