-1

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

提前致谢。

4

1 回答 1

0

没有理由使用 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使用上面的着色器。

于 2017-05-31T05:21:07.997 回答