Jump to content
  • Advertisement
Sign in to follow this  
Tordin

DX11 Directx11 - Shader Constantbuffers vs the world.

This topic is 2796 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

Hey!

i working on some dx11 stuff and are at the point where i need to be able to set shader variables easy and fast, since it gonna happen in runtime i am looking for the fastest way to do this.

At the moment i am struggeling with Constant buffers and i havent realy found another way to set shader input variabels, so my big question is :

How do i in the fastest CPU SPEED way set shadervariables? i need them to change on the fly for each frame.

Is CBuffers the way to do it?
Is there any other way to do it?
Is that otherway faster than remapping the cbuffer?

Would be glad for articels, information, tutorials and more!

cheers !

Share this post


Link to post
Share on other sites
Advertisement
If you want performance, than constant buffers are absolutely the way to go. No question. You obviously want to limit the amount of data that you map and update, and the way to do that is to group your constants based on how often they change. So for example if your view * projection matrix never changes the entire frame, put in a PerFrames cb and only set them once a frame. If you set a world matrix for each draw call, put that in a PerDraws cb.

Share this post


Link to post
Share on other sites
is PreFrame cb a different constant buffer than a regular Cbuffer?
is PreDraw cb a different constant buffer than a regular Cbuffer?

How do they work? (if they exsist?)

or do you just mean to have different cb in the shader with less data than a full global one?

Share this post


Link to post
Share on other sites
No those are just names I picked, I just meant that you should split up your constants into multiple buffers rather than grouping them all together into one giant constant buffer.

Share this post


Link to post
Share on other sites
That does actually touch on something I've been wanting to ask about MJP. Say you want to set a VP matrix on a per frame basis. How would you go about that in detail.

In my framework I'm working without the DX effects as I wanted to learn the nitty gritty details. And when I reflect my shaders to find the bind information a given CB containing the VP matrix (for the sake of this example let it contain only that) it might give me different bind points for different shaders.

How exactly would I avoid having to bind the information for each shader. Even when specifying the CB register that doesn't change the bind points, and I just haven't been able to find any information regarding them.

Share this post


Link to post
Share on other sites
Are you talking about the register (slot) that a constant buffer is bound to using *SetConstantBuffers, or the offset into a constant buffer into which an actual variable is placed?

Share this post


Link to post
Share on other sites
If you manually bind a constant buffer to a register using "register : (cb0)", then you can use that index to bind the D3D11 constant buffer at runtime. If you want you can keep your commonly-used constant buffers in a header file and #include that in all of your shaders, which makes it easier to manage.

Share this post


Link to post
Share on other sites
Another way to improve performance for CPU related configuration of the pipeline is to use the multithreading capabilities of D3D11. If you are using 2 or 4 cores to submit the requested changes into command lists, and then submit the command lists to the immediate context then you will almost surely be faster than doing it in a single thread on a single core.

Share this post


Link to post
Share on other sites
Ah, i see.
Than this brings me to another question.

Say i have 3 sets of CBs,
When i set thees and do the call "SetVSConstantBuffer" for the second one for example, should i set the "numBuff" to 1? or 2?

or is this where the register thing come into play?

Can some one give me a example & explenation of the cb & registery system?

i have understood it like this :

ConstantBuffer WorldViewProjection {
matrix World : World <--- in my c++ buffer i have to have a variable named that name?
};

Or is this wrong?

Cheers!

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.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!