【发布时间】:2021-04-07 06:39:13
【问题描述】:
像素着色器未正确使用纹理。我在我的像素着色器中加载了两个单独的纹理。但是,大多数时候,我只能显示 Texture1,即使我尝试显示 Texture2。
Texture2D Texture1;
Texture2D Texture2;
SamplerState ss;
float4 main(float4 position: SV_POSITION, float4 color: COLOR, float2 texCoord: TEXCOORD) : SV_TARGET
{
float4 color1 = Texture1.Sample(ss, texCoord);
float4 color2 = Texture2.Sample(ss, texCoord);
// even though color2 is specified here, color1 ie Texture1 is still displayed
float4 finalColor = color2;
return finalColor;
}
上面的代码总是显示纹理 1(砖块): texture 1
奇怪的是,我可以显示第二个纹理,但前提是我将像素着色器修改为如下所示:
float4 main(float4 position: SV_POSITION, float4 color: COLOR, float2 texCoord: TEXCOORD) : SV_TARGET
{
float4 color1 = Texture1.Sample(ss, texCoord);
float4 color2 = Texture2.Sample(ss, texCoord);
float4 finalColor = {0,0,0,0};
if (color1.z != color2.z) {
// no idea why, but setting finalColor to color2 outside of this if statement
// doesn't work.
finalColor = color2;
}
return finalColor;
}
这会显示第二个纹理(木头):texture 2
这是加载纹理的代码:
// load the texture
HRESULT hr = CreateWICTextureFromFile(m_dev.Get(), nullptr, L"bricks.png", nullptr, &m_texture1, 0);
hr = CreateWICTextureFromFile(m_dev.Get(), nullptr, L"wood.png", nullptr, &m_texture2, 0);
...
m_devCon->PSSetShaderResources(0, 1, m_texture1.GetAddressOf());
m_devCon->PSSetShaderResources(1, 1, m_texture2.GetAddressOf());
这里发生了什么?我知道两个纹理都加载到像素着色器中,因为如果我使用这个奇怪的 hack,我可以获得第二个纹理来显示。
【问题讨论】:
-
尝试使用显式绑定:
Texture2D<float4> Texture1 : register(t0); Texture2D<float4> Texture2 : register(t1); sampler ss : register(s0). -
@ChuckWalbourn 成功了,现在我的颜色可以正常改变了!谢谢 您能否发表您的评论作为答案,以便我将其标记为正确?也许更详细地说明为什么这可以解决问题?
标签: shader directx-11 hlsl pixel-shader