HLSL的输入输出结构定义了该着色器的输入和输出顶点数据
struct VS_INPUT
{
vector position : POSITION;
};
// Output structure describes the vertex that is
// output from the shader. Here the output
// vertex contains a position and color component.
struct VS_OUTPUT
{
vector position : POSITION;
vector diffuse : COLOR;
};
此种语法建立了着色器中的变量和硬件存储器之间的联系,即输入变量总是与输入存储器关联,
输出变量总是与输出存储器关联,VS_INPUT结构的成员position将被连接到一个特定的顶点输入
位置寄存器,类似的,VS_OUTPUT成员diffuse将被连接到一个特定的顶点输出颜色寄存器中。
像C++函数一样,HLSL程序也应该有一个入口点,称为入口函数,但入口函数的名称在遵循命名规则的
前提下其名称可自由选择(可以不再叫Main)
VS_OUTPUT Main(VS_INPUT input)
{
// zero out members of output
VS_OUTPUT output = (VS_OUTPUT)0;
// transform to view space and project
output.position = mul(input.position, ViewProjMatrix);
// set vertex diffuse color to blue
output.diffuse = Blue;
return output;
}
入口函数主要负责依据输入顶点计算输出顶点。
如果要在着色器中获取ViewProjMatrix变量的一个句柄,那么可用如下方式实现:
D3DXHANDLE h0;
h0 = ConstTable->GetConstantByName(0,"ViewProjMatrix");
一旦获取了着色器代码中哪个变量的D3DXHANDLE类型的句柄,就可使用ID3DXConstantTable::SetXXX对变量进行设置
可用如下函数对保存在文本文件中的着色器程序进行编译
HRESULT D3DXCompileShaderFromFile(
__in LPCSTR pSrcFile,
__in const D3DXMACRO *pDefines,
__in LPD3DXINCLUDE pInclude,
__in LPCSTR pFunctionName,
__in LPCSTR pProfile,
__in DWORD Flags,
__out LPD3DXBUFFER *ppShader,
__out LPD3DXBUFFER *ppErrorMsgs,
__out LPD3DXCONSTANTTABLE *ppConstantTable
);
HLSL的变量类型:标量类型,向量类型,矩阵类型,数组,结构体