Followers 0

# DX11 Lighting problem in deferred rendering

## 14 posts in this topic

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.

[attachment=22703:bugged DX11.png]

0

##### Share on other sites

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
0

##### Share on other sites

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]

0

##### Share on other sites

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

1

##### Share on other sites

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)

0

##### Share on other sites

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 ;

};

0

##### Share on other sites

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
0

##### Share on other sites

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 ;

0

##### Share on other sites

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.

0

##### Share on other sites

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 ?

0

##### Share on other sites

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

0

##### Share on other sites

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

if somebody knows for the matrices !...

0

##### Share on other sites

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.

0

##### Share on other sites

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 ?

0

##### Share on other sites
// 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 );
0

## Create an account

Register a new account

Followers 0

• ### Similar Content

• Hi Guys,
I am revisiting an old DX11 framework I was creating a while back and am scratching my head with a small issue.
I am trying to set the pixel shader resources and am getting the following error on every loop.
As you can see in the below code, I am clearing out the shader resources as per the documentation. (Even going overboard and doing it both sides of the main PSSet call). But I just can't get rid of the error. Which results in the render target not being drawn.
ID3D11ShaderResourceView* srv = { 0 }; d3dContext->PSSetShaderResources(0, 1, &srv); for (std::vector<RenderTarget>::iterator it = rtVector.begin(); it != rtVector.end(); ++it) { if (it->szName == name) { //std::cout << it->srv <<"\r\n"; d3dContext->PSSetShaderResources(0, 1, &it->srv); break; } } d3dContext->PSSetShaderResources(0, 1, &srv);
I am storing the RT's in a vector and setting them by name. I have tested the it->srv and am retrieving a valid pointer.
At this stage I am out of ideas.
Any help would be greatly appreciated

• hi, guys, how to understand the math used in CDXUTDirectionWidget ::UpdateLightDir
the  following code snippet is taken from MS DXTU source code

D3DXMATRIX mInvView;
D3DXMatrixInverse( &mInvView, NULL, &m_mView );
mInvView._41 = mInvView._42 = mInvView._43 = 0;
D3DXMATRIX mLastRotInv;
D3DXMatrixInverse( &mLastRotInv, NULL, &m_mRotSnapshot );
D3DXMATRIX mRot = *m_ArcBall.GetRotationMatrix();
m_mRotSnapshot = mRot;
// Accumulate the delta of the arcball's rotation in view space.
// Note that per-frame delta rotations could be problematic over long periods of time.
m_mRot *= m_mView * mLastRotInv * mRot * mInvView;
// Since we're accumulating delta rotations, we need to orthonormalize
// the matrix to prevent eventual matrix skew
D3DXVECTOR3* pXBasis = ( D3DXVECTOR3* )&m_mRot._11;
D3DXVECTOR3* pYBasis = ( D3DXVECTOR3* )&m_mRot._21;
D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&m_mRot._31;
D3DXVec3Normalize( pXBasis, pXBasis );
D3DXVec3Cross( pYBasis, pZBasis, pXBasis );
D3DXVec3Normalize( pYBasis, pYBasis );
D3DXVec3Cross( pZBasis, pXBasis, pYBasis );

https://github.com/Microsoft/DXUT/blob/master/Optional/DXUTcamera.cpp
• By YixunLiu
Hi,
I have a surface mesh and I want to use a cone to cut a hole on the surface mesh.
Anybody know a fast method to calculate the intersected boundary of these two geometries?

Thanks.

YL

• By hiya83
Hi, I tried searching for this but either I failed or couldn't find anything. I know there's D11/D12 interop and there are extensions for GL/D11 (though not very efficient). I was wondering if there's any Vulkan/D11 or Vulkan/D12 interop?
Thanks!

• Hi Guys,
I am just wondering if it is possible to acquire the address of the backbuffer if an API (based on DX11) only exposes the 'device' and 'context' pointers?
Any advice would be greatly appreciated

• 9
• 17
• 11
• 28
• 14