• Create Account

## 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.

14 replies to this topic

### #1theScore  Members

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.

### #2Migi0027 (肉コーダ)  Members

4383
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/

### #3theScore  Members

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 :

And positions :

### #4Migi0027 (肉コーダ)  Members

4383
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/

### #5theScore  Members

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)

### #6theScore  Members

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 ;

};


### #7Migi0027 (肉コーダ)  Members

4383
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/

### #8theScore  Members

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 ;


### #9Migi0027 (肉コーダ)  Members

4383
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/

### #10theScore  Members

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 ?

### #11Migi0027 (肉コーダ)  Members

4383
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/

### #12theScore  Members

158
Like
0Likes
Like

Posted 18 July 2014 - 08:02 AM

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

if somebody knows for the matrices !...

### #13Zaoshi Kaba  Members

7790
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.

### #14theScore  Members

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 ?

### #15Zaoshi Kaba  Members

7790
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.