• Advertisement
Sign in to follow this  

DX11 DX11-Reuse or Create a new 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

Hi, so I get at a point where I can render a cube, yay. Now my program loads an .OBJ file to a vposnormaltex layout struct array. I want know how I render new stuff every time I want. Should I reuse the buffer? Or should I Create a new one(using the same ID3D11Buffer)? I notice theres this HRESULT SetPrivateData( REFGUID guid, UINT DataSize, const void *pData ); that the ID3D11Buffer inherits, but Im not sure what I should do..

Share this post


Link to post
Share on other sites
Advertisement
Quote:
Original post by Icebone1000
Hi, so I get at a point where I can render a cube, yay. Now my program loads an .OBJ file to a vposnormaltex layout struct array.

I want know how I render new stuff every time I want. Should I reuse the buffer? Or should I Create a new one(using the same ID3D11Buffer)?

A buffer can contain any number of objects in any particular formats you want. Just as long as you have allocated enough space for it. The important thing is that you don't create buffers that are too large (a few meg is usually good), and that you properly specify their usage so that they can be placed in the best locations for them (static geometry should not be specified with dynamic/cpu read and write, for instance).
Quote:

I notice theres this
HRESULT SetPrivateData(
REFGUID guid,
UINT DataSize,
const void *pData
);
that the ID3D11Buffer inherits, but Im not sure what I should do..

That does not do what you think it does.

Share this post


Link to post
Share on other sites
The thing is that the data I want render are set at running time, my app have a open .obj menu item..Everytime a .obj file is opened I want to display the object(Im not considering yet display all .obj opened, just one by one now to make easier).

What my app do at start is set a cube, create a vertexbuffer(subresource = cube), bind it to the input assembly, and render.

What should I do when the .obj is readed?:
-Create a new dx buffer, point the vposnormaltex array, bind it to the IA?

-Re-set the dx buffer, that is alredy binded to the IA(dont know if this is how things works, I remember something like this on DX9, using 'lock' to bring GPU stuff to mem, re-set and sending back)?

Share this post


Link to post
Share on other sites
Keep the array of geometry, a pointer to the vertrex buffer, the topology type and the layout together in a class or structure.

For each of these, on every frame, you just set the input type, set the vertex buffer and render everything.

Ideally, you should keep state changes to a minimum. I suppose if your input layout is always the same, you can set it once but realistically this never really happens once you get past the initial stages.

I would suggest trying whatever works for you and when you know more, take a look at the performance considerations documentation on MSDN.

Share this post


Link to post
Share on other sites
Thanks for the info.

But I still dont know if theres a way to re-set an alredy created buffer or if I can recreate it every time I want change the data on it.

My program specificaly have 4 types of input layout( pos, posnorm, postex, postexnorm ), witch also means I have to recompile also another effect file.. heres the approach Im taking everytime a file is opened:



OPENFILENAME openFile = {0};
...
if( GetOpenFileName( &openFile ) ){
std::ifstream File;
File.open( openFile.lpstrFile,std::ios::in|std::ios::_Nocreate );

if( File.is_open() ){
myOBJ.OBJReadDataFromFileStream( File );
myOBJ.OBJTransformDataToDXLayout();

switch( myOBJ.OBJGetOBJType() ){
case 0x00:
if( DXInitEffect( TEXT("BasicTr.fx"), g_pEffect, g_pETech, g_pEPass, g_pDevice ) != S_OK ){
MB( " dxerror", "effect load fail", MB_E ); }
break;
case 0xff:
if( DXInitEffect( TEXT("BasicTransformLightTex.fx"), g_pEffect, g_pETech, g_pEPass, g_pDevice ) != S_OK ){
MB( " dxerror", "effect load fail", MB_E );
}
break;
case 0xf0:
if( DXInitEffect( TEXT("BasicTransformLight.fx"), g_pEffect, g_pETech, g_pEPass, g_pDevice ) != S_OK ){MB( " dxerror", "effect load fail", MB_E );
}
break;
case 0x0f:
if( DXInitEffect( TEXT("BasicTransformTex.fx"), g_pEffect, g_pETech, g_pEPass, g_pDevice ) != S_OK ){
MB( " dxerror", "effect load fail", MB_E );
}
break;
}

if( DXSetBufferResources( g_pDevice, g_pVB, g_pIB, myOBJ.OBJGetDXVBData(), myOBJ.OBJGetDXVBDataSize() ) != S_OK ){
MB( " dxerror", "set buff", MB_E );
}

if( DXInitInputAssemble( g_pDevice,g_pDIContext,myOBJ.OBJGetDXInputLayout(), myOBJ.OBJGetDXLayoutNumElms(), g_pEPass,g_pInputLayout, &g_pVB, 1, myOBJ.OBJGetDXStride(), &g_pIB, 1 ) != S_OK ){
MB( " dxerror", "init ia", MB_E ); }

DXSetSCBVariablesInitialValues();//reset matrices and set texture

iVcount = myOBJ.OBJGetDXVCount();
bStuffToRender = TRUE;
File.close();

}//is open







Its working fine...but I really dont know how I would do on a game( I dont know many things in fact...)
Is normal an app call a million times pass->apply() and dc->Draw()?

I cant imagine how would be manage the transformation matrices for a bunch of different objects... And how would be sprite animation? On OpenGL what I was used to do is change the texcoord everytime, pretty automatic..cant see any similar way of doing this on DX.

Share this post


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

  • Advertisement
  • Advertisement
  • Popular Now

  • Advertisement
  • Similar Content

    • By AxeGuywithanAxe
      I wanted to see how others are currently handling descriptor heap updates and management.
      I've read a few articles and there tends to be three major strategies :
      1 ) You split up descriptor heaps per shader stage ( i.e one for vertex shader , pixel , hull, etc)
      2) You have one descriptor heap for an entire pipeline
      3) You split up descriptor heaps for update each update frequency (i.e EResourceSet_PerInstance , EResourceSet_PerPass , EResourceSet_PerMaterial, etc)
      The benefits of the first two approaches is that it makes it easier to port current code, and descriptor / resource descriptor management and updating tends to be easier to manage, but it seems to be not as efficient.
      The benefits of the third approach seems to be that it's the most efficient because you only manage and update objects when they change.
    • By evelyn4you
      hi,
      until now i use typical vertexshader approach for skinning with a Constantbuffer containing the transform matrix for the bones and an the vertexbuffer containing bone index and bone weight.
      Now i have implemented realtime environment  probe cubemaping so i have to render my scene from many point of views and the time for skinning takes too long because it is recalculated for every side of the cubemap.
      For Info i am working on Win7 an therefore use one Shadermodel 5.0 not 5.x that have more options, or is there a way to use 5.x in Win 7
      My Graphic Card is Directx 12 compatible NVidia GTX 960
      the member turanszkij has posted a good for me understandable compute shader. ( for Info: in his engine he uses an optimized version of it )
      https://turanszkij.wordpress.com/2017/09/09/skinning-in-compute-shader/
      Now my questions
       is it possible to feed the compute shader with my orignial vertexbuffer or do i have to copy it in several ByteAdressBuffers as implemented in the following code ?
        the same question is about the constant buffer of the matrixes
       my more urgent question is how do i feed my normal pipeline with the result of the compute Shader which are 2 RWByteAddressBuffers that contain position an normal
      for example i could use 2 vertexbuffer bindings
      1 containing only the uv coordinates
      2.containing position and normal
      How do i copy from the RWByteAddressBuffers to the vertexbuffer ?
       
      (Code from turanszkij )
      Here is my shader implementation for skinning a mesh in a compute shader:
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 struct Bone { float4x4 pose; }; StructuredBuffer<Bone> boneBuffer;   ByteAddressBuffer vertexBuffer_POS; // T-Pose pos ByteAddressBuffer vertexBuffer_NOR; // T-Pose normal ByteAddressBuffer vertexBuffer_WEI; // bone weights ByteAddressBuffer vertexBuffer_BON; // bone indices   RWByteAddressBuffer streamoutBuffer_POS; // skinned pos RWByteAddressBuffer streamoutBuffer_NOR; // skinned normal RWByteAddressBuffer streamoutBuffer_PRE; // previous frame skinned pos   inline void Skinning(inout float4 pos, inout float4 nor, in float4 inBon, in float4 inWei) {  float4 p = 0, pp = 0;  float3 n = 0;  float4x4 m;  float3x3 m3;  float weisum = 0;   // force loop to reduce register pressure  // though this way we can not interleave TEX - ALU operations  [loop]  for (uint i = 0; ((i &lt; 4) &amp;&amp; (weisum&lt;1.0f)); ++i)  {  m = boneBuffer[(uint)inBon].pose;  m3 = (float3x3)m;   p += mul(float4(pos.xyz, 1), m)*inWei;  n += mul(nor.xyz, m3)*inWei;   weisum += inWei;  }   bool w = any(inWei);  pos.xyz = w ? p.xyz : pos.xyz;  nor.xyz = w ? n : nor.xyz; }   [numthreads(1024, 1, 1)] void main( uint3 DTid : SV_DispatchThreadID ) {  const uint fetchAddress = DTid.x * 16; // stride is 16 bytes for each vertex buffer now...   uint4 pos_u = vertexBuffer_POS.Load4(fetchAddress);  uint4 nor_u = vertexBuffer_NOR.Load4(fetchAddress);  uint4 wei_u = vertexBuffer_WEI.Load4(fetchAddress);  uint4 bon_u = vertexBuffer_BON.Load4(fetchAddress);   float4 pos = asfloat(pos_u);  float4 nor = asfloat(nor_u);  float4 wei = asfloat(wei_u);  float4 bon = asfloat(bon_u);   Skinning(pos, nor, bon, wei);   pos_u = asuint(pos);  nor_u = asuint(nor);   // copy prev frame current pos to current frame prev pos streamoutBuffer_PRE.Store4(fetchAddress, streamoutBuffer_POS.Load4(fetchAddress)); // write out skinned props:  streamoutBuffer_POS.Store4(fetchAddress, pos_u);  streamoutBuffer_NOR.Store4(fetchAddress, nor_u); }  
    • By mister345
      Hi, can someone please explain why this is giving an assertion EyePosition!=0 exception?
       
      _lightBufferVS->viewMatrix = DirectX::XMMatrixLookAtLH(XMLoadFloat3(&_lightBufferVS->position), XMLoadFloat3(&_lookAt), XMLoadFloat3(&up));
      It looks like DirectX doesnt want the 2nd parameter to be a zero vector in the assertion, but I passed in a zero vector with this exact same code in another program and it ran just fine. (Here is the version of the code that worked - note XMLoadFloat3(&m_lookAt) parameter value is (0,0,0) at runtime - I debugged it - but it throws no exceptions.
          m_viewMatrix = DirectX::XMMatrixLookAtLH(XMLoadFloat3(&m_position), XMLoadFloat3(&m_lookAt), XMLoadFloat3(&up)); Here is the repo for the broken code (See LightClass) https://github.com/mister51213/DirectX11Engine/blob/master/DirectX11Engine/LightClass.cpp
      and here is the repo with the alternative version of the code that is working with a value of (0,0,0) for the second parameter.
      https://github.com/mister51213/DX11Port_SoftShadows/blob/master/Engine/lightclass.cpp
    • By mister345
      Hi, can somebody please tell me in clear simple steps how to debug and step through an hlsl shader file?
      I already did Debug > Start Graphics Debugging > then captured some frames from Visual Studio and
      double clicked on the frame to open it, but no idea where to go from there.
       
      I've been searching for hours and there's no information on this, not even on the Microsoft Website!
      They say "open the  Graphics Pixel History window" but there is no such window!
      Then they say, in the "Pipeline Stages choose Start Debugging"  but the Start Debugging option is nowhere to be found in the whole interface.
      Also, how do I even open the hlsl file that I want to set a break point in from inside the Graphics Debugger?
       
      All I want to do is set a break point in a specific hlsl file, step thru it, and see the data, but this is so unbelievably complicated
      and Microsoft's instructions are horrible! Somebody please, please help.
       
       
       

    • By mister345
      I finally ported Rastertek's tutorial # 42 on soft shadows and blur shading. This tutorial has a ton of really useful effects and there's no working version anywhere online.
      Unfortunately it just draws a black screen. Not sure what's causing it. I'm guessing the camera or ortho matrix transforms are wrong, light directions, or maybe texture resources not being properly initialized.  I didnt change any of the variables though, only upgraded all types and functions DirectX3DVector3 to XMFLOAT3, and used DirectXTK for texture loading. If anyone is willing to take a look at what might be causing the black screen, maybe something pops out to you, let me know, thanks.
      https://github.com/mister51213/DX11Port_SoftShadows
       
      Also, for reference, here's tutorial #40 which has normal shadows but no blur, which I also ported, and it works perfectly.
      https://github.com/mister51213/DX11Port_ShadowMapping
       
  • Advertisement