我目前正在为基本的高斯模糊编写一个HLSL
着色器。着色器代码简单明了,但我不断收到错误消息:
不在dx9兼容模式下时,将禁用DX9样式intristics。 (LN#:19)
这告诉我代码中的第19行就是问题所在,我相信这是由于该特定行中的tex2D
或Sampler
造成的。
#include "Common.hlsl"
Texture2D Texture0 : register(t0);
SamplerState Sampler : register(s0);
float4 PSMain(PixelShaderInput pixel) : SV_Target {
float2 uv = pixel.TextureUV; // This is TEXCOORD0.
float4 result = 0.0f;
float offsets[21] = { ... };
float weights[21] = { ... };
// Blur horizontally.
for (int x = 0; x < 21; x++)
result += tex2D(Sampler, float2(uv.x + offsets[x], uv.y)) * weights[x];
return result;
}
有关代码和我的问题的注释,请参见下文。
由于我的代码在没有连接的计算机上,因此我必须手动将代码键入StackOverflow。因此:
offsets
和weights
中缺少值。
offsets
是从-10
到10
的每个整数。weights
的范围从0.01
到0.25
,再回到0.01
。15
。13 - 59
,其中封装了tex2D
和Sampler
。Sampler
调用中为tex2D
使用了错误的数据类型吗?tex2D
吗?答案 0 :(得分:2)
经过广泛的搜索,我发现tex2D
及更高版本不再支持ps_4_0
。好吧,4_0
可以在旧版模式下运行,但是5_0
不能用,这就是我正在使用的模式。
着色器模型:受支持
Shader Model 4:是(仅像素着色器),但是在编译时必须使用旧版编译选项。
Shader Model 3(DirectX HLSL):是(仅像素着色器)
Shader Model 2(DirectX HLSL):是(仅像素着色器)
着色器模型1(DirectX HLSL):是(仅像素着色器)
已被Texture2D
取代; documentation可用。以下是上述文档的示例:
// Object Declarations
Texture2D g_MeshTexture;
SamplerState MeshTextureSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
struct VS_OUTPUT
{
float4 Position : SV_POSITION;
float4 Diffuse : COLOR0;
float2 TextureUV : TEXCOORD0;
};
VS_OUTPUT In;
// Shader body calling the intrinsic function
Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
要替换我代码中的tex2D
调用:
result += Texture0.Sample(Sampler, float2(uv.x + offsets[x], uv.y)) * weights[x];
另外,请注意,本文中的代码是针对高斯模糊的水平传递的。