如何解决在像素着色器 (DirectX11) 中无法正确访问纹理
像素着色器未正确使用纹理。我正在我的像素着色器中加载两个单独的纹理。但是,大多数情况下,我只能显示 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;
}
奇怪的部分是,我可以显示第二个纹理,但前提是我将像素着色器修改为:
float4 main(float4 position: SV_POSITION,texCoord);
float4 finalColor = {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;
}
这是加载纹理的代码:
// load the texture
HRESULT hr = CreateWICTextureFromFile(m_dev.Get(),nullptr,L"bricks.png",&m_texture1,0);
hr = CreateWICTextureFromFile(m_dev.Get(),L"wood.png",&m_texture2,0);
...
m_devCon->PSSetShaderResources(0,1,m_texture1.GetAddressOf());
m_devCon->PSSetShaderResources(1,m_texture2.GetAddressOf());
这里发生了什么?我知道两个纹理都加载到像素着色器中的事实,因为如果我使用这个奇怪的技巧,我可以获得第二个纹理。
解决方法
HLSL 中的这些声明声明了两个纹理槽和一个采样槽,但它们没有指明它们被绑定的位置。正如声明的那样,您必须使用着色器反射来确定这一点,例如通过旧版 Effects 系统。
Texture2D Texture1;
Texture2D Texture2;
SamplerState ss;
为了使用显式绑定,您需要指明每个项目绑定到哪个插槽。在纹理中明确声明预期的通道数也是一种很好的形式(在这种情况下,我假设有 4 个通道):
Texture2D<float4> Texture1 : register(t0);
Texture2D<float4> Texture2 : register(t1);
SamplerState ss : register(s0);
由于您的代码实际上并未显示为使用 CreateSamplerState
创建采样器并使用 PSSetSamplers
将其绑定到 0 槽,因此您依赖于 {{3} 中说明的“默认”采样器状态D3D11_FILTER_MIN_MAG_MIP_LINEAR
的 }} 与 D3D11_TEXTURE_ADDRESS_CLAMP
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。