This compiles just fine, but when I try to load it in MonoGame, SharpDX gives me a cryptic "Invalid Parameter" error.
What's wrong with this shader?
5 hours ago, MatsK said:This compiles just fine, but when I try to load it in MonoGame, SharpDX gives me a cryptic "Invalid Parameter" error.
My guess is something to do with passing a texture sampler as a param in the shader
9 hours ago, Steve_Segreto said:passing a texture sampler
That is what I'm looking at as well. This doc.microsoft talks about shader model changes. sampler_state{Texture= is a d3d9 keyword only. Surely not sm4.0
is a similar discussion I believe.
58 minutes ago, MarkK. said:sampler_state{Texture= is a d3d9 keyword only. Surely not sm4.0
Wait, what?
Ok so how would that be in SM4.0?
Here's the new code:
texture DisplacementMap;
/*sampler DisplacementSampler = sampler_state
{
Texture = <DisplacementMap>;
MipFilter = Point;
MinFilter = Point;
MagFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};*/
SamplerState DisplacementSampler
{
Texture = <DisplacementMap>;
MipFilter = Point;
MinFilter = Point;
MagFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
struct VS_INPUT
{
float4 position : POSITION;
float4 uv : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 uv : TEXCOORD0;
float4 worldPos : TEXCOORD1;
float4 textureWeights : TEXCOORD2;
float4 position : POSITION;
};
float4x4 world;
float4x4 view;
float4x4 proj;
float maxHeight = 128;
float textureSize = 512.0f;
float texelSize = 1.0f / 512.0f; //size of one texel;
float4 tex2Dlod_bilinear(/*sampler texSam,*/ float4 uv)
{
float4 height00 = tex2Dlod(DisplacementSampler, uv);
float4 height10 = tex2Dlod(DisplacementSampler, uv + float4(texelSize, 0, 0, 0));
float4 height01 = tex2Dlod(DisplacementSampler, uv + float4(0, texelSize, 0, 0));
float4 height11 = tex2Dlod(DisplacementSampler, uv + float4(texelSize, texelSize, 0, 0));
float2 f = frac(uv.xy * textureSize);
float4 tA = lerp(height00, height10, f.x);
float4 tB = lerp(height01, height11, f.x);
return lerp(tA, tB, f.y);
}
VS_OUTPUT Transform(VS_INPUT In)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
float4x4 viewProj = mul(view, proj);
float4x4 worldViewProj = mul(world, viewProj);
float height = tex2Dlod_bilinear(/*DisplacementSampler,*/ float4(In.uv.xy, 0, 0)).r;
In.position.y = height * maxHeight;
Out.worldPos = mul(In.position, world);
Out.position = mul(In.position, worldViewProj);
Out.uv = In.uv;
float4 TexWeights = 0;
TexWeights.x = saturate(1.0f - abs(height - 0) / 0.2f);
TexWeights.y = saturate(1.0f - abs(height - 0.3) / 0.25f);
TexWeights.z = saturate(1.0f - abs(height - 0.6) / 0.25f);
TexWeights.w = saturate(1.0f - abs(height - 0.9) / 0.25f);
float totalWeight = TexWeights.x + TexWeights.y + TexWeights.z + TexWeights.w;
TexWeights /= totalWeight;
Out.textureWeights = TexWeights;
return Out;
}
technique GridDraw
{
pass P0
{
VertexShader = compile vs_4_0 Transform();
}
}
I'm not saying the previously mentioned is your problem, but clearly you are missing the suggestion that the keyword -Texture in the sampler_state block will probably not be valid in shader model 4 as you define in your technique pass.
reference: https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-to-sample
If the api you are using is d3d9, try vs_4_0_level_9_1 perhaps. This is what my declaration looks like (monogame)
texture ModelTexture;
sampler2D TextureSampler = sampler_state
{
Texture = (ModelTexture);
MagFilter = Linear;
MinFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
};
12 minutes ago, MarkK. said:I'm not saying the previously mentioned is your problem, but clearly you are missing the suggestion that the keyword Texture in the sampler_state block will probably not be valid in shader model 4 as you define in your technique pass.
Thanks! How do I pass the texture to the sampler?
This [gamedev.se] discussion touches on that and an access optimization.
I'm making assumptions in monogame. SharpDx I've not touched.