如何在 Direct3D 10 中进行纹理混合?
How to do texture blending in Direct3D 10?
到目前为止,我发现您需要创建一个 ID3D10BlendState 对象,使用 D3D10_BLEND_DESC 结构调用 CreateBlendState(),然后调用 OMSetBlendState()。但我不知道如何调用 Draw() 函数以及如何 Apply() 纹理。我有需要与普通纹理混合的光照贴图纹理。顶点是否需要多个纹理坐标?我是否需要为每个多边形绘制两次,一次用于纹理,一次用于光照贴图?我也不太想使用纹理数组。
提前致谢。
没有理由使用 DirectX 10。DirectX 11 在所有相同平台上完全取代它(Windows Vista SP2 或更高版本都支持 DirectX 11),并且支持范围更广的 video hardware. In addition, the only place to find DirectX 10 samples and utility code is in the legacy DirectX SDK. For DirectX 11, there are numerous open-source replacements for the old deprecated D3DX
library, as well as samples .
Direct3D 10 及更高版本都使用可编程着色器,而不是传统的 'fixed function' 管线。因此,您实现光照映射的方式是在用 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 },
};
A good place to start with C++ coding for DirectX 11 is the DirectX Tool Kit. It includes the DualTextureEffect
which uses the shader above.
到目前为止,我发现您需要创建一个 ID3D10BlendState 对象,使用 D3D10_BLEND_DESC 结构调用 CreateBlendState(),然后调用 OMSetBlendState()。但我不知道如何调用 Draw() 函数以及如何 Apply() 纹理。我有需要与普通纹理混合的光照贴图纹理。顶点是否需要多个纹理坐标?我是否需要为每个多边形绘制两次,一次用于纹理,一次用于光照贴图?我也不太想使用纹理数组。
提前致谢。
没有理由使用 DirectX 10。DirectX 11 在所有相同平台上完全取代它(Windows Vista SP2 或更高版本都支持 DirectX 11),并且支持范围更广的 video hardware. In addition, the only place to find DirectX 10 samples and utility code is in the legacy DirectX SDK. For DirectX 11, there are numerous open-source replacements for the old deprecated D3DX
library, as well as samples .
Direct3D 10 及更高版本都使用可编程着色器,而不是传统的 'fixed function' 管线。因此,您实现光照映射的方式是在用 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 },
};
A good place to start with C++ coding for DirectX 11 is the DirectX Tool Kit. It includes the
DualTextureEffect
which uses the shader above.