如何在Direct3D 10中进行纹理混合?

时间:2017-05-30 21:06:38

标签: c++ direct3d10

到目前为止,我发现您需要创建一个ID3D10BlendState对象,使用D3D10_BLEND_DESC结构调用CreateBlendState(),并调用OMSetBlendState()。但我不知道如何调用Draw()函数以及如何Apply()纹理。我有光照贴图纹理,我需要与普通纹理混合。我需要顶点的多个纹理坐标吗?我是否需要绘制每个多边形两次,一次用于纹理,一次用于光照贴图?我也不想使用纹理数组。

提前致谢。

1 个答案:

答案 0 :(得分:0)

没有理由使用DirectX 10. DirectX 11在所有相同的平台上完全取代它(Windows Vista SP2或更高版本都支持DirectX 11),并支持更广泛的video hardware。此外,查找DirectX 10样本和实用程序代码的唯一位置是遗留DirectX SDK。对于DirectX 11,旧的已弃用的D3DX库以及open-source replacements有很多samples

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 Tool Kit。它包含使用上面着色器的DualTextureEffect