HLSL(DX9)编程

HLSL概述:编写DX着色器代码的高级编程语言,DX9可以使用HLSL编写顶点/像素着色器.
输入和输出结构: 这些结构分别定义了该着色器的输入和输出的顶点数据(即输入输出顶点的结构)
struct VS_INPUT
{ //:冒号表示一种语义,用来指定变量的用途
vector position : POSITION; //位置分量 POSITION 表示向量 position 用于描述输入顶点的位置信息
};

struct VS_OUTPUT
{
vector position : POSITION; //位置分量 POSITION 表示向量 position 用于描述输出顶点的位置信息
vector diffuse : COLOR; //颜色分量 COLOR 表示向量 diffuse 用于描述输出顶点的颜色信息
};

入口函数:和C/C++一样,每个 HLSL 程序必须有一个入口点,例如 Main,但名称并非强制性的,遵循命名规则即可。
入口函数形参:必须有一个可接收输入结构的参数,用于把输入顶点传给着色器
入口函数返回:必须返回一个输出结构的实例,用来将经过处理的顶点从着色器输出

入口函数定义方法之一
VS_OUTPUT Main(VS_INPUT input)
{
//入口函数主要负责依据输入顶点计算输出顶点
… …
VS_OUTPUT output = (VS_OUTPUT)0; //定义一个结构变量并初始化为0

output.position = mul( input.position, ViewProjMatrix);	//mul()返回矩阵乘积
output.diffuse = Blue;				//将顶点颜色设为蓝色

return output;					//必须返回一个输出结构实例

}

入口函数定义方法二
float4 Main(in float2 base : TEXCOORD0,
in float2 spot : TEXCOORD1,
in float2 text : TEXCOORD2) : COLOR //"COLOR"签名表示着色器将返回一个单个颜色作为输出
{
//入口函数主要负责依据输入顶点计算输出顶点
… …
}

上面Main函数定义等价于以下代码:

struct INPUT
{
float2 base : TEXCOORD0;
float2 spot : TEXCOORD1;
float2 text : TEXCOORD2;
};

strcut OUTPUT
{
float4 c : COLOR;
};

OUTPUT Main( INPUT input)
{
//入口函数主要负责依据输入顶点计算输出顶点
… …
}

常量表:

获取常量的句柄:
每个着色器都用常量表来存储其变量,为了使程序能够访问着色器的常量表,D3DX库提供了接口 ID3DXConstantTable
借助该接口可以在程序源代码中对着色器变量进行访问
获取着色器常量的句柄 :
D3DXHANDLE ID3DXConstantTable::GetConstantByName(
D3DXHANDLE hConstant, //常数范围
LPCSTR pName //常数名称
);
hConstant 一个 D3DXHANDLE 类型的句柄,标识了那个包含了我们希望获取其句柄的变量的父结构。例如希望获得
某个特定结构实例的一个单个数据成员的句柄,可为该参数传入该结构实例的句柄。如果想要获取指向顶级变量
的句柄,应将该参数指定为0.
pName 我们希望获取其句柄的那个着色器源代码中的变量的名称

例如:如果期望应用的着色器中的变量名称为 ViewProjMatrix,且该变量是顶级参数,我们可这样实现引用:
D3DXHANDLE h0;
h0 = ConstTable->GetConstantByName(0,“ViewProjMatrix”);

常量的设置:
一旦应用程序获得了着色器代码中希望引用的那个变量的 D3DXHANDLE 类型的句柄,我们就可以在应用程序中使用方法 ID3DXConstantTable::SetXXX对该变量进行设置,其中XXX表示被设置变量的类型名称,实际调用时只要用类型名将其替换即可。例如我们希望设置的变量为一个 vector 类型的数组,该方法将对应 SetVectorArray。

//方法 ID2DXConstanTable::SetXXX 的通用签名如下:
HRESULT ID3DXConstantTable::SetXXX(
	LPDIRECT3DDEVICE9 pDevice,
	D3DXHANDLE hConstant,
	XXX value
);
  • pDevice 与常量表相关的设置指针
  • hConstant 我们想要设置的那个变量的句柄
  • value 指定了我们引用的那个着色器中的变量应被赋为何值,其中 XXX 应替换为该变量的类型名,对于某些类型(bool,int,float)我们传入的时该值的副本,而对于另外一些类型(向量,矩阵,结构体)我们传入的时指向该值的指针。
    如果要对数组进行设置,SetXXX 方法还应增加一个参数,以接收该数组的维数,例如,用于设置一个4D向量的数组的方法原型为:
HRESULT ID3DXConstantTable::SetVectorArray(
	LPDIRECT3DDEVICE9 pDevice,			//关联设备
	D3DXHANDLE hConstant,				//着色变量句柄
	CONST D3DXVECTOR4* pVector,			//对于数组指针
	UINT Count							//数组中的元素数
);

下面的列表描述了那些可用结构 ID3DXConstantTable 进行设置的类型,假定我们已经拥有了一个合法的设备指针(Device)以及索要设置的变量的句柄。


 - setBool 				用于设置一个布尔值
 - SetBoolArray 		用于设置布尔数组
 - SetFloat				用于设置一个浮点数
 - SetFloatArray		用于设置一个浮点数数组
 - SetInt				用于设置一个整数
 - SetIntArray			用于设置一个整数数组
 - SetMaitrix			用于设置一个4*4的矩阵
 - SetMatrixArray		用于设置一个4*4的矩阵数组
 - SetMatrixPointerArray	用于设置一个4*4矩阵的指针数组
 - SetMatrixTranspose		用于设置一个4*4的转置矩阵
 - SetMatrixTransposeArray	用于设置一个4*4的转置矩阵数组
 - SetVector			用于设置一个 D3DXVECTOR4 类型的变量
 - SetVectorArray		用于设置向量数组类型的变量
 - SetValue				用于设置大小任意的类型,例如结构体

设置常量的默认值:
下面的方法仅是将常量设为其默认值,即那些在变量声明时被赋予的初值,该方法在应用程序的设置过程中,应调用一次。

HRESULT ID3DXConstantTable::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值