如何使用DirectX11着色器将纹理应用于正交平面

时间:2013-03-28 20:12:12

标签: c++ textures shader hlsl directx-11

我正在尝试将纹理图像应用于正交平面,以便它可以用作'U.I.装饰”。

飞机由D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP格式的两个三部分组成。当我尝试使用着色器渲染平面时,它只是以白色显示(或者如果我将混合状态设置为true则不可见)。我相信这是因为我只是在正交平面上对纹理的四个角进行采样,因为我只在顶点着色器中进行采样。

这是我的着色器中的当前代码:

void VSMain( const VSInput input, out PSInput output) {
    output.pos = input.pos;
    output.pos = mul( output.pos, g_WVP);

    float2 tex_pos;
    float4 Tex;
    tex_pos.x = ( input.pos.x + 512) / 1024;
    tex_pos.y = (-input.pos.z + 512) / 1024;

    Tex = g_materialMap.SampleLevel( g_sampler, tex_pos, 0);

    output.colour = Tex;
}

void PSMain( const PSInput input, out PSOutput output) {
    output.colour = input.colour;
}

当我将此着色器应用于我当前在场景中渲染的高度图时,它可以正常工作,但它在正交平面上无法正常工作。

任何人都可以帮我正确地将此纹理应用于正交平面吗? (如果需要,我可以提供当前场景的截图)

1 个答案:

答案 0 :(得分:1)

我自己发现并解决了这个问题。

采样DOES需要在像素着色器中完成才能正确着色,但我错过了添加纹理以使像素着色器可见。

修复方法如下:

切换线

Tex = g_materialMap.SampleLevel( g_sampler, tex_pos, 0);

output.tex = tex_pos;

然后,在像素着色器中放入

float4 Tex = g_materialMap.Sample( g_sampler, input.tex);
output.colour = Tex;