首页 > 解决方案 > 我的 HLSL 着色器中的 TEXCOORD0 总是指向 (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) 上的像素。

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

标签: directxhlsldirectx-9

解决方案


您的着色器代码有一个采样器,但纹理在哪里?从微软文档

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 );

没有这个,它仍然可以构建,因为它隐含地假设你的意思是t0.

您在此着色器中使用了“显式绑定”,如果您要避免使用旧版效果系统,则建议这样做非常好。也就是说,Direct3D 9 开发人员教育材料和示例在很大程度上基于使用稍微不同的语法的效果,因此会造成混淆。

您没有显示您的 C/C++ 代码,因此它也可能与您的绑定代码有关。

请注意,如果这些天来编写 Direct3D 9 代码,请记住一些重要的事情:

  • DirectX SDK 已弃用和遗留,强烈建议不要使用它。请参阅Microsoft 文档。它有许多已知问题,甚至安装起来也很困难。

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

  • D3DX9 实用程序库也已被弃用,但它确实是获得 Direct3D 9 支持代码的唯一方法。从今年早些时候开始,您现在可以通过简单的并行重新分发从NuGet使用它,而不是依赖旧版 DirectX SDK 或旧版 DirectX 最终用户运行时 Redist。请参阅此博客文章

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

  • 旧版 DirectX SDK 中的所有 Direct3D 9 示例都可以在GitHub上找到。

您应该将 DirectX 11 视为一个更好的起点,它具有更好的调试支持、工具支持和开源库。请参阅此博客文章


推荐阅读