如何在Direct3d 10中进行纹理混合



到目前为止,我发现您需要创建一个ID3D10BlendState对象,用D3D10_BLEND_DESC结构调用CreateBlendState((,并调用OmsetBlendState((。但是我不知道如何调用draw((函数以及如何应用((纹理。我的光图纹理需要与普通纹理混合。我是否需要多个纹理坐标来供顶点?我需要两次绘制每个poly,一次以进行纹理,然后绘制光图?我也不真的想使用纹理阵列。

预先感谢。

没有理由使用DirectX10。DirectX 11在所有相同的平台(Windows Vista sp2或以后所有支持DirectX 11(上完全取代了它,并支持更广泛的视频硬件。此外,唯一找到DirectX 10示例和实用代码的地方是Legacy DirectX SDK。对于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

最新更新