我的 HLSL 着色器中的 TEXCOORD0 始终指向 (0,0)

TEXCOORD0 in my HLSL shader always points to (0,0)

我正在研究 directx9,我正在尝试使用着色器,这是我的着色器:

sampler texLastPass : register( s0 );

float4 main(in float2 t : TEXCOORD0) : COLOR
{
    float4 color = tex2D(texLastPass, t);
    return float4(color.rgb, 1.0f);
}

理论上应该不会有任何变化,但我的整个对象都充满了纹理中位置 (0, 0) 上的像素。

那么为什么提供给着色器的像素坐标是错误的?

您的着色器代码有采样器,但纹理在哪里?来自 Microsoft Docs:

Three things are required to sample a texture:

* A texture
* A sampler (with sampler state)
* A sampling instruction

由于您缺少与纹理的绑定,Direct3D 9 将为您提供所有纹理引用的值 0,0,0。

texture tex0 : register( t0 );

Without this it still builds because it implicitly assumes you mean t0.

您在此着色器中使用 'explicit binding',这非常好,如果您避免使用旧版效果系统,建议使用。也就是说,Direct3D 9 开发人员教育材料和示例在很大程度上基于使用略有不同语法的 Effects,因此造成了混淆。

你没有显示你的 C/C++ 代码,所以它也可能与你的绑定代码有关。

请注意,如果最近编写 Direct3D 9 代码,请记住以下重要事项:

  • DirectX SDK 已弃用且已遗留,强烈建议不要使用它。参见 Microsoft Docs。它有许多已知问题,甚至安装都具有挑战性。

  • Direct3D 9 的核心 headers 是 Windows SDK 的一部分,因此它们已经是 Visual Studio 2012 或更高版本的一部分。您不需要 DirectX SDK 来构建 Direct3D 9 代码。

  • D3DX9 实用程序库也已弃用,但确实是获得 Direct3D 9 支持代码的唯一途径。从今年早些时候开始,您现在可以从 NuGet with a simple side-by-side redistribution rather than rely on the legacy DirectX SDK or the legacy DirectX End-User Runtime Redist. See this blog post.

    消费它
  • Windows 8、Windows 8.1 或 Windows 10 不支持 Direct3D 9 调试设备。

  • 旧版 DirectX SDK 中的所有 Direct3D 9 示例都可以在 GitHub.

    上找到

You should take a look at DirectX 11 as a better starting point which has much better debugging support, tools support, and open source libraries. See this blog post.