我目前正在为基本的高斯模糊编写HLSL
着色器。 着色器代码很简单,但我一直收到错误:
不在dx9兼容模式下,DX9样式内置被禁用。 (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
。 tex2D
调用中使用了错误的Sampler
数据类型吗? DirectX 11
是否弃用tex2D
? 经过一番广泛的搜索,我发现ps_4_0
及以上不再支持tex2D
。 好吧, 4_0
将在传统模式下工作,但它不起作用5_0
这就是我正在使用的。
着色器模型:支持
着色器模型4:是(仅限像素着色器),但在编译时必须使用旧版编译选项。
着色器模型3(DirectX HLSL):是(仅限像素着色器)
着色器模型2(DirectX HLSL):是(仅限像素着色器)
着色器模型1(DirectX HLSL):是(仅限像素着色器)
这已被Texture2D
取代; 文档可用于它。 以下是上述文档中的示例:
// 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];
另请注意,此帖中的代码用于高斯模糊的水平传递。