到目前为止,我发现您需要创建一个 ID3D10BlendState 对象,使用 D3D10_BLEND_DESC 结构调用 CreateBlendState(),然后调用 OMSetBlendState()。但我不知道如何调用 Draw() 函数以及如何 Apply() 纹理。我有需要与普通纹理混合的光照贴图纹理。顶点是否需要多个纹理坐标?我是否需要将每个多边形绘制两次,一次用于纹理,一次用于光照贴图?我也不想使用纹理数组。
提前致谢。
到目前为止,我发现您需要创建一个 ID3D10BlendState 对象,使用 D3D10_BLEND_DESC 结构调用 CreateBlendState(),然后调用 OMSetBlendState()。但我不知道如何调用 Draw() 函数以及如何 Apply() 纹理。我有需要与普通纹理混合的光照贴图纹理。顶点是否需要多个纹理坐标?我是否需要将每个多边形绘制两次,一次用于纹理,一次用于光照贴图?我也不想使用纹理数组。
提前致谢。
没有理由使用 DirectX 10。DirectX 11 在所有相同的平台(Windows Vista SP2 或更高版本都支持 DirectX 11)上完全取代它,并支持更广泛的视频硬件。此外,只能在旧版DirectX SDK中找到 DirectX 10 示例和实用程序代码。对于 DirectX 11,旧的已弃用库以及示例有许多开源替代品。D3DX
Direct3D 10 和更高版本都使用可编程着色器,而不是传统的“固定功能”管道。因此,您实现光照映射的方式是在用 HLSL 编写的像素着色器中:
Texture2D<float4> Texture : register(t0);
Texture2D<float4> Texture2 : register(t1);
sampler Sampler : register(s0);
sampler Sampler2 : register(s1);
float4 PSDualTextureNoFog(PSInputTx2NoFog pin) : SV_Target0
{
float4 color = Texture.Sample(Sampler, pin.TexCoord);
float4 overlay = Texture2.Sample(Sampler2, pin.TexCoord2);
color.rgb *= 2;
color *= overlay * pin.Diffuse;
return color;
}
您将使用它离线构建FXC
它,然后在运行时将它与顶点着色器一起绑定。通常对于光照贴图,您会在输入布局中使用两个纹理坐标集:
const D3D11_INPUT_ELEMENT_DESC VertexPositionDualTexture::InputElements[] =
{
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
开始使用 DirectX 11 的 C++ 编码的一个好地方是DirectX 工具包。它包括
DualTextureEffect
使用上面的着色器。