我的 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.
我正在研究 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.