1
\$\begingroup\$

I am in trouble at trying to pass a big amount of variables needed for my pixel shader computations.

After trying and failing to link my struct to a cbuffer (data alignement mismatch) I tried passing my variables first to the vertex shader (with an D3D11_INPUT_ELEMENT_DESC / CreateInputLayout) with the intent to link them to the pixel shader through semantics but I hit the 32 shader inputs limit.

I am really stuck (and quite a noob at DX). What is a common / standard way to do this ? Can I only rely on a cbuffer ? Is creating a D3D11_INPUT_ELEMENT_DESC / CreateInputLayout even possible for the pixel shader ?

Example struct I want to pass to my pixel shader :

struct SceneParamsInterface { bool DEAOEnabled; XMFLOAT4 DEAOColor; double DEAOPow; bool lightEnabled; XMFLOAT4 lightColor; XMFLOAT3 lightDirection; bool lightMultiply; double lightMultiplyFactor; bool ambiantLightEnabled; XMFLOAT4 ambiantLightColor; bool HSEnabled; int HSSpread; bool fogEnabled; XMFLOAT4 fogColor; double fogDistanceMax; bool glowEnabled; XMFLOAT4 glowColor; double glowRadius; XMFLOAT4 skyColor; bool skyBoxEnabled; //uniform sampler2D skyBoxTexture; int skyBoxScheme0; // top int skyBoxScheme1; // left int skyBoxScheme2; // front int skyBoxScheme3; // right int skyBoxScheme4; // back int skyBoxScheme5; // bottom int skyBoxRotate; double skyBoxRotateSpeed; XMFLOAT3 skyBoxRotateAround; bool orbitTrapsEnabled; int orbitTrapsId; XMFLOAT4 objectColor; }; 

Thanks!

\$\endgroup\$
6
  • \$\begingroup\$ Can you tell us what the parameters are that you are passing and what you are doing with them in the shader? \$\endgroup\$ Commented Aug 16, 2015 at 0:54
  • \$\begingroup\$ stackoverflow.com/questions/14711763/… \$\endgroup\$ Commented Aug 16, 2015 at 1:25
  • \$\begingroup\$ @AlanWolfe I didn't write the pixel shader code yet (I am porting GLSL code to HLSL) but I need all these variables (63+) available in my pixel shader for raytracing computation. I have 4 C++ structs for that purpose - see the one I posted up there. \$\endgroup\$ Commented Aug 16, 2015 at 12:25
  • \$\begingroup\$ Seeing nobody answered yet - I dont know much about dx11, but if you used openGl you could use texture or a buffer where usually geometry is stored. \$\endgroup\$ Commented Aug 16, 2015 at 21:51
  • 1
    \$\begingroup\$ This is the classic "Direct3D 9" design where you had to use a global set of constants. This is an extremely inefficient way to use Direct3D 11 Constant Buffers. See Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games--yes this is a Direct3D 10 era talk but it 100% applies to Direct3D 11 too. \$\endgroup\$ Commented Aug 18, 2015 at 3:02

1 Answer 1

7
\$\begingroup\$

Use several constant buffers and group variables together based on how often they change.

If your variables are fairly static ( or just huge ) you may be better off converting values into a texture and extracting them in the shader.

\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.