一.简介
高级着色语言(High)可以编写顶点着色器和像素着色器,取代固定功能流水线中的部分功能,在图形卡的GPU(Graphics Processing Unit,图形处理单元)中执行
注意:如果图形卡不支持顶点着色器和像素着色器,可以切换为REF设备,但是这个设备会运行很慢
Shader language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language)
基于Direct3D的HLSL(High Level Shading Language)
NVIDIA公司的Cg(C for Graphic)语言
二.D3DXCompileShaderFromFile()
可以用.txt文本文件来存储着色器代码,再用D3DXCompileShaderFromFile()来加载
1.顶点着色器
顶点着色器定义了着色器输入和输出的顶点数据
像素着色器定义了着色器输入和输出的像素数据
// 该顶点着色器对顶点实施了取景变换(view transformation)和投影变换(projection transform),并将顶点的漫反射颜色分量设为蓝色
// 一个HLSL内置的4*4矩阵类型,存储的是一个视图矩阵和投影矩阵的乘积
matrix ViewProjMatrix;
// 一个HLSL内置的4D向量类型,初始化为RGBA颜色的蓝色向量
vector Blue = {0.0f, 0.0f, 1.0f, 1.0f};
// 着色器输入结构的顶点数据
struct VS_INPUT
{
// 位置分量
vector position : POSITION;
};
// 着色器输出结构的顶点数据
struct VS_OUTPUT
{
// 位置分量 颜色分量
vector position : POSITION;
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;
}
// 另一种入口 函数的表示方法 struct INPUT { float2 base : TEXCOORD0; float2 spot : TEXCOORD1; float2 text : TEXCOORD2; }; struct OUTPUT { float4 c : COLOR; }; float4 Main(int float2 base : TEXCOORD0, int float2 spot : TEXCOORD1, int float2 text : TEXCOORD2) : COLOR { .. }