无法让 texture.Sample 工作,尽管我可以让 texture.Load 在 Direct 3d 11 着色器中正常工作

Can't get texture.Sample to work, although I can get texture.Load to work fine in Direct 3d 11 shader

在我的 Direct3d 11 应用程序的 HLSL 中,我遇到了一个问题,其中 texture.Sample 内在总是 return 0。我知道我的数据和参数是正确的,因为如果我使用 texture.Load 而不是 Sample 值 returned 是正确的。

这是我的声明:

extern Texture2D<float> texMask;

SamplerState TextureSampler : register (s2);

这是我的像素着色器中有效的代码——这确认我的纹理可正确用于着色器并且我的 texcoord 值是正确的:

float maskColor = texMask.Load(int3(8192*texcoord.x, 4096*texcoord.y, 0));

如果我用下面的行替换它,maskColor 总是 0,我不知道为什么。

float maskColor = texMask.Sample(TextureSampler, texcoord);

TextureSampler 具有默认状态值; texMask 定义为 1 个 mip 级别。

我也试过:

float maskColor = texMask.SampleLevel(TextureSampler, texcoord, 0);

而且总是 returns 0.

设置采样器的C++代码:

D3D11_SAMPLER_DESC sd;
ZeroMemory(&sd, sizeof(D3D11_SAMPLER_DESC));
sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sd.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
ID3D11SamplerState* pSampler;
dev->CreateSamplerState(&sd, &pSampler);

devcon->PSSetSamplers(2, 1, &pSampler);

我发现了我的问题——我需要为我的 HLSL 中的纹理和采样器指定一个寄存器。我找不到任何描述为什么这是必要的文档,但它确实解决了我的问题。

请原谅我恢复这么旧的 post,但我认为为其他人添加此类问题的另一个可能原因很重要,这个 post 是我能找到的最相关的地方在

中找到 post

我也有一个问题,即 HLSL 样本函数总是 return 0,但仅在 特定 纹理上,而不在其他纹理上。我检查过,确保纹理被正确绑定,并且颜色值不应该为 0,并且仍然想知道为什么我总是为这个 one 特定纹理返回 0,但是没有其他人在同一个着色器通道中使用。 Load 函数工作正常,但后来我失去了采样器给我们的好功能。

事实证明,就我而言,我不小心将此纹理的描述创建为:

D3D11_TEXTURE2D_DESC desc;
desc.Width = _width;
desc.Height = _height;
desc.MipLevels = 0; // <- Bad!
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;

这有效并创建了可见且可渲染的纹理,但是当将 MipLevels 定义为 0 时,DirectX 会为该纹理生成整个 mip 链。然而,我就是我,我在进一步处理我的项目时忘记了这一点,虽然 DirectX 可能会为 mip 链生成纹理,但绘制到纹理不会级联链的所有级别(我想这确实有意义).

现在,我想重要的是要注意我对整个图形编程事物仍然是新手,如果这还不够明显的话。我完全不知道常规 Sample 函数使用什么 mip 级别或 mip 级别的组合。但我可以说,在我的例子中,它并没有碰巧是 0 级。也许对于较小的 mip 链来说它会,但这个纹理特别是总共有 12 个级别,只有 0 级有任何实际颜色信息绘制给它。使用 Load 函数或 SampleLevel 显式访问 mip 级别 0 工作正常。因为我不需要,也不想要,我试图采样的纹理有一个 mip 链,我简单地改变了它的描述来修复它。