Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Lighting problem in deferred rendering


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
14 replies to this topic

#1 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 05:53 AM

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 !

 

bugged DX11.png



Sponsor:

#2 Migi0027 (肉コーダ)   Crossbones+   -  Reputation: 3735

Like
0Likes
Like

Posted 18 July 2014 - 06:43 AM

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


Edited by Migi0027, 18 July 2014 - 06:44 AM.

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/cuboidzone.wordpress.com/


#3 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 07:01 AM

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 :

 

normals texture.png

 

And positions :

 

positions texture.png

 

 



#4 Migi0027 (肉コーダ)   Crossbones+   -  Reputation: 3735

Like
1Likes
Like

Posted 18 July 2014 - 07:18 AM

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


FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/cuboidzone.wordpress.com/


#5 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 07:20 AM

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)



#6 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 07:23 AM

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 ;

};


#7 Migi0027 (肉コーダ)   Crossbones+   -  Reputation: 3735

Like
0Likes
Like

Posted 18 July 2014 - 07:25 AM

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


Edited by Migi0027, 18 July 2014 - 07:26 AM.

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/cuboidzone.wordpress.com/


#8 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 07:34 AM

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 ;


#9 Migi0027 (肉コーダ)   Crossbones+   -  Reputation: 3735

Like
0Likes
Like

Posted 18 July 2014 - 07:47 AM

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.


FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/cuboidzone.wordpress.com/


#10 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 07:56 AM

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 ?



#11 Migi0027 (肉コーダ)   Crossbones+   -  Reputation: 3735

Like
0Likes
Like

Posted 18 July 2014 - 07:59 AM

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


FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/cuboidzone.wordpress.com/


#12 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 08:02 AM

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

if somebody knows for the matrices !...



#13 Zaoshi Kaba   Crossbones+   -  Reputation: 5776

Like
0Likes
Like

Posted 18 July 2014 - 08:37 AM

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.



#14 theScore   Members   -  Reputation: 158

Like
0Likes
Like

Posted 18 July 2014 - 08:59 AM

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 ?



#15 Zaoshi Kaba   Crossbones+   -  Reputation: 5776

Like
0Likes
Like

Posted 18 July 2014 - 10:36 AM

// 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 );





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS