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

Lighting problem in deferred rendering

Started by theScore Jul 18, 2014 at 11:53 AM 13 replies 1.8k views
Original Post
theScore
theScore

Hi !

I have a lighting problem, the scene is lit and a part or it is unlit, I don't understand why. If I amplify light intensity for example, lit parts of the scene are more lit but the part which is in shadow, is better lighted. There is no shadow mapping implemented in this program, and I even not manage to guess what kind of problem it could be.

This is deferred rendering, so in the image below, the lighting is applied on a texture pixel by pixel, which is applied on a quad.

It doesn't seem to be the number of lights (just 1 present in the scene), I tried with more lights and it is the same problem.

Somebody whould have an idea to understand it ? If you have more questions about this, don't hesitate to ask me !

[attachment=22703:bugged DX11.png]

Veiled Glitch
Veiled Glitch

Hi theScore,

can we see how you reconstruct the position, normal, etc...? ( I think this is the fault )

in what space are they stored in? View, model, perspective?

So to help you further, it would be awesome if we could see this:

  • How you store the GBUFFER
  • How you use/extract from the GBUFFER
  • How you calculate your lighting with the extracted values from the GBUFFER

EDIT: Try to just render the reconstructed normals, positions to see if it looks right. Or use a modern graphics debugger to check the render targets.

Cheers!

-MIGI0027

theScore
theScore

Hi !

Positions and normals are stored in 2 vectors of 4 floats of 16 bit for each one.

Threre are stored in view space.

Normals are stored like this :

[attachment=22704:normals texture.png]

And positions :

[attachment=22705:positions texture.png]

Veiled Glitch
Veiled Glitch

The positions look off, can we see how you store them?

theScore
theScore

Another problem may be here (vertex shader from Gbuffer pass) :


        matrix <float, 4, 4> projView = mul(proj, view) ;
	matrix <float, 4, 4> projViewWorld = mul(projView, world) ;
	

	output.RTposition = mul( input.position, view );
 	output.color = input.color ;
	output.RTnormal = mul( input.normal, view);


 	output.texCoord = input.texCoord ;

	output.finalPos= mul( projViewWorld, input.position );

The world matrix is an identity matrix from CPU code, it is for that, that I only multiply positions and normals by the view matrix.

But I am doing :

positions * viewMatrix

normals * viewMatrix

And :

ProjViewWorldMatrix * positions ; //so, not in the same order...

If I change the order in the shader it doen't work (black screen)

theScore
theScore

Structs in VS :


struct vsIn
{
	half4 position : POSITION ;
 	half4 normal   : NORMAL ;
	half4 texCoord : TEXCOORD0 ; 
	half4 color    : COLOR0 ;
};

struct vsOut
{
	half4 finalPos :SV_POSITION ;
	half4 color : COLOR0 ;
	half4 RTposition : POSITION1 ;
 	half4 RTnormal   : NORMAL   ;
	half4 texCoord : TEXCOORD0 ;

};

And structs in pixel shader :


struct psIn
{	
	half4 finalPos		: SV_POSITION ;
 	half4 color			: COLOR0 ;
	half4 RTposition	: POSITION1 ;
	half4 RTnormal		: NORMAL ;
	half4 texCoord		: TEXCOORD0 ;

};
Veiled Glitch
Veiled Glitch

How are the matrices structued? Row Major? Column Major?

Just to try, transpose the view matrix thats used on the normals and positions, and do as you did before: viewMatrix * position

theScore
theScore

I use XMMatrixLookAtLH,it is in row major.

I did that and I have the same result than in my first post : (I am not sure that it is what you expected ?)


	matrix <float, 4, 4> projView = mul(proj, view) ;
	matrix <float, 4, 4> projViewWorld = mul(projView, world) ;
	
	matrix <float, 4, 4> transposedView = transpose(view);

	output.RTposition = mul( transposedView, input.position );
 	output.color = input.color ;
	output.RTnormal = mul( transposedView, input.normal);


 	output.texCoord = input.texCoord ;

	output.finalPos= mul( projViewWorld, input.position );
    
	return output ;
Veiled Glitch
Veiled Glitch

Yeah that's what I meant. I've never used XMMatrix, though I should transition to it.

Forget the transposing. When you multiply the view matrix with the position, remember that its a point, so you'd need to write mul(view, float4(input.position.xyz, 1)); But for the normal, leave the w component 0, or instead multiply the normals by the 3x3 view matrix.

theScore
theScore

Finally, I did that and it works :


	output.RTposition = mul( input.position, transposedView );
 	output.color = input.color ;
	output.RTnormal = mul( input.normal, view );

And I don't understand why positions can't be multipied by a row major matrix... Do you know it ?

Veiled Glitch
Veiled Glitch

Awesome!

Im afraid my knowledge of matrices is very limited, maybe someone with a better overview of the concept can help you. I wouldnt want to pass wrong information to you.

-MIGI0027

theScore
theScore

Ok smile.png thanks for your help, you put me on the line.

if somebody knows for the matrices !...

Zaoshi Kaba
Zaoshi Kaba

Without going into theory/details: when it comes to matrices A * B != B * A. If your matrix is different (row vs column) then multiplication order is reversed, you can also reverse it by transposing all matrices.

theScore
theScore

Ok but here I perform the multiplication in the same order, with the same matrix but transposed once and the other time not transposed, so I don't understand why it works here and with the same processing not ?

Zaoshi Kaba
Zaoshi Kaba

// these two are equivalent
output.RTposition = mul( input.position, transposedView ); // transposing reverses order
output.RTposition = mul( view, input.position ); // judging by your projViewWorld matrix this is correct order

// if those lines are correct, then this one is wrong order
output.RTnormal = mul( input.normal, view );

Topic Locked

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

Sign in to reply to this topic.