Skip to main content
GameDev.net gamedev.net
🔒 Locked

What's wrong with this shader?

Started by MatsK Oct 7, 2019 at 9:55 PM 7 replies 4.4k views
Original Post
MatsK
MatsK

Shader source

This compiles just fine, but when I try to load it in MonoGame, SharpDX gives me a cryptic "Invalid Parameter" error. :(

fleabay
fleabay

I don't know what I'm talking about with HLSL but this looks wrong. Shouldn't float4 have 4 values?

float4(In.uv.xy, 0, 0)).r;

ED: nevermind, xy is 2 values.

🙂🙂🙂🙂🙂<←The tone posse, ready for action.
NubDevice
NubDevice
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.

Dev careful. Pixel on board.
Buckle up. Everything will be revealed.
MatsK
MatsK

I changed it, it didn't work! :(

MatsK
MatsK
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();
	}
}


NubDevice
NubDevice

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


Dev careful. Pixel on board.
Buckle up. Everything will be revealed.
MatsK
MatsK
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?


NubDevice
NubDevice

This [gamedev.se] discussion touches on that and an access optimization.

I'm making assumptions in monogame. SharpDx I've not touched.
Dev careful. Pixel on board.
Buckle up. Everything will be revealed.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.