Jump to content
  • Advertisement
Sign in to follow this  

[DX 11] Scrambled constant buffer

This topic is 2863 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Somehow I've once again managed to scramble my buffers...

I recently added a bunch of new variables to one of my constant buffer types, and added them to the corresponding shaders that use them, but I'm finding that one of the variables is becoming corrupted, and many of the other variables are out of order.

Here's my constant buffer type:

struct SkyConstantBufferType
XMFLOAT3 cameraPos;
XMFLOAT3 sunDir;
float bro;
float bmo;
float g;//eccentricity
float Esun;

And the code that creates it for D3D11:

bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SkyConstantBufferType);
bd.CPUAccessFlags = 0;
hr = g_pd3dDevice->CreateBuffer(&bd, NULL, &g_pSkyConstantBuffer);

And my draw call where I'm updating/binding it:

SkyConstantBufferType skyCb;
skyCb.camView = XMMatrixTranspose(conversions::boostToD3DMatrix4x4((g_quatCam.getRotationMatrix())));

boost::numeric::ublas::vector<float> camPos(3);
camPos = g_quatCam.getLocation();
skyCb.cameraPos.x = camPos[0];
skyCb.cameraPos.y = camPos[1];
skyCb.cameraPos.z = camPos[2];
skyCb.Esun = g_esun;
skyCb.bmo = g_mie;
skyCb.bro = g_rayleigh;

skyCb.sunDir.x = g_sunDir[0];
skyCb.sunDir.y = g_sunDir[1];
skyCb.sunDir.z = g_sunDir[2];
skyCb.g = g_g;

g_pImmediateContext->UpdateSubresource(g_pSkyConstantBuffer, 0, NULL, &skyCb, 0,0);

g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pSkyVertexBuffer, &stride, &offset);

// Set primitive topology
g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP );

g_pImmediateContext->VSSetShader(g_pSkyVShader, NULL, 0);
g_pImmediateContext->VSSetConstantBuffers(0, 1, &g_pSkyConstantBuffer);
g_pImmediateContext->PSSetShader(g_pSkyPShader, NULL,0);
g_pImmediateContext->PSSetConstantBuffers(0,1, &g_pSkyConstantBuffer);

Here's the relevant code on the shader side:

cbuffer ConstantBuffer : register(b0)
matrix camView;
float3 cameraPos;
float3 sunDir;
float bro;
float bmo;
float g;
float Esun;

struct PS_INPUT
float4 Pos : SV_POSITION;
float4 Ray : RAY;

//.... Intervening helper functions omitted...

PS_INPUT outPos = (PS_INPUT)0;
outPos.Pos = Pos;
outPos.Ray = float4(mul(outPos.Pos.xyz, (float3x3)camView), 0);
outPos.Ray = normalize(outPos.Ray);
return outPos;

float4 PS(PS_INPUT Pos) : SV_Target
///..... Pixel shader stage omitted ....

What I'm finding in PIX, is that when I get to the pixel shader stage, that the following constant variables are messed up:
bmo = correct_g
bro = correct_bmo
cameraPos is correct.
Esun = garbage (negative very large number)
g = correct_Esun
sunDir = { correct_sundir[1], correct_sundir[2], correct_bro}

camView does not show in PIX, I assume this is because it's not used in the pixel shader stage.

Where "correct" on the front is equal to what the associated variable should be (i.e. my bro = what i expect bmo to equal, etc...).

Are there some kind of alignment requirements that I'm missing? I've added many more and much larger variables to some of my other constant buffers in other shaders without any issues, but I've been racking my brain and code trying to figure out what I'm doing wrong here and can't see it...

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!