下面是自己在学习HLSL编程过程中的一些笔记:
1.顶点声明时D3DVERTEXELEMENT9结构体中UsageIndex字段用于标识多个相同用途的顶点向量。比如如下声明:
D3DVERTEXELEMENT9 MorphMeshDecl[] =
{
//1st stream is for source mesh - position, normal, texcoord
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
//2nd stream is for target mesh - position, normal
{ 1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 1 },
{ 1, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 1 },
D3DDECL_END()
};
在第一个数据流中已经有了D3DDECLUSAGE_POSITION和D3DDECLUSAGE_NORMAL,在第二个数据流中这两个相同用途分量的索引就应该在前面基础上加一,注意这个值的范围是0~15
2.Texture和Surface区别:两者都指定了显存中(使用D3DPOOL_SYSTEM创建的位于系统内存中)一块连续的空间,对于一个使用D3DXCreateTexture()接口创建出来的LPDIRECT3DTEXTURE9指针来说(比如pTexture),与其对应的Surface可以通过
pTexture->GetSurfaceLevel( 0, &pSurface );(其中pSurface为IDirect3DSurface9指针),由于D3D中无法直接对Texture进行写操作,所以只能通过对与其相关联的Surface进行写操作来实现,例如可以使用下面两个接口对Surface进行操作:
HRESULT UpdateSurface( IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, CONST POINT* pDestinationPoint );
不过使用该接口时需要注意,pSourceSurface必须是系统内存,pDestinationSurface必须是显存。
HRESULT StretchRect( IDirect3DSurface9 * pSourceSurface, CONST RECT * pSourceRect, IDirect3DSurface9 * pDestSurface, CONST RECT * pDestRect, D3DTEXTUREFILTERTYPE Filter );
注意该接口中的pSourceSurface和pDestSurface必须是显存。
3.D3DXCompileShaderFromFile()函数返回E_FAIL原因,在程序中使用如下代码来编译shader:
hr = D3DXCompileShaderFromFile(
"ps_multitex.txt",
0,
0,
"Main",
"ps_3_0",
D3DXSHADER_DEBUG | D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY,
&shader,
&errorBuffer,
&MultiTexCT);
环境为VS2008+DirectX2009,调试时发现hr总是返回E_FAIL,但是通过Direct3D自带的控制台使用fxc工具编译时能够编译成功,最后发现
是由于该函数传递shader源文件时需要绝对路径,将上述函数中"ps_multitex.txt"修改为"D://ps_multitex.txt"即可