Quote:
- Use IDirect3DDevice9::DrawPrimitiveUP to render your Quads straight from the array your code is accessing (internally the device will copy the data to a location the GPU can access directly, but it will avoid the lock).
I have researched this option and discovered that it can be slow and/or exhibit other problems, so unfortunately I won't be able to use it.
Okay, I tried yet another approach at drawing quads dynamically.
This time I tried to cut out the use of a copy of my vertex buffer (and the subsequent need to make a memcpy() call) and instead created arrays of QUADS, which are written directly to the vertex buffer at draw time. Here is my code, below:
//DRAW QUADS VERTEXCELLS* vb_cells_pt=0; d3ddev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); d3ddev->SetTexture(0, t_cells); d3ddev->SetStreamSource(0, vb_cells, 0, sizeof(VERTEXCELLS)); d3ddev->SetFVF(VERTEX_CELLS); //draw quads1[] vb_cells->Lock(0, 3*sizeof(VERTEXCELLS), (void**)&vb_cells_pt, D3DLOCK_DISCARD); //write quad1 contents to buffer for(int quad1=0; quad1<NUM_CELL_QUADS; quad1++) { vb_cells_pt[quad1*6].color=quads1[quad1].color; vb_cells_pt[quad1*6].u=quads1[quad1].u; vb_cells_pt[quad1*6].v=quads1[quad1].v; vb_cells_pt[quad1*6].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+1].color=quads1[quad1].color; vb_cells_pt[quad1*6+1].u=quads1[quad1].u; vb_cells_pt[quad1*6+1].v=quads1[quad1].v; vb_cells_pt[quad1*6+1].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+1].pos.x+=100; vb_cells_pt[quad1*6+1].pos.z+=0; vb_cells_pt[quad1*6+2].color=quads1[quad1].color; vb_cells_pt[quad1*6+2].u=quads1[quad1].u; vb_cells_pt[quad1*6+2].v=quads1[quad1].v; vb_cells_pt[quad1*6+2].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+2].pos.x+=100; vb_cells_pt[quad1*6+2].pos.z+=100; vb_cells_pt[quad1*6+3].color=quads1[quad1].color; vb_cells_pt[quad1*6+3].u=quads1[quad1].u; vb_cells_pt[quad1*6+3].v=quads1[quad1].v; vb_cells_pt[quad1*6+3].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+3].pos.x+=0; vb_cells_pt[quad1*6+3].pos.z+=0; vb_cells_pt[quad1*6+4].color=quads1[quad1].color; vb_cells_pt[quad1*6+4].u=quads1[quad1].u; vb_cells_pt[quad1*6+4].v=quads1[quad1].v; vb_cells_pt[quad1*6+4].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+4].pos.x+=100; vb_cells_pt[quad1*6+4].pos.z+=100; vb_cells_pt[quad1*6+5].color=quads1[quad1].color; vb_cells_pt[quad1*6+5].u=quads1[quad1].u; vb_cells_pt[quad1*6+5].v=quads1[quad1].v; vb_cells_pt[quad1*6+5].pos=quads1[quad1].pos; vb_cells_pt[quad1*6+5].pos.x+=0; vb_cells_pt[quad1*6+5].pos.z+=100; } vb_cells->Unlock(); d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CELL_QUADS); //draw quads2[] vb_cells->Lock(0, 3*sizeof(VERTEXCELLS), (void**)&vb_cells_pt, D3DLOCK_DISCARD); //write quad1 contents to buffer //write quad1 contents to buffer for(int quad2=0; quad2<NUM_CELL_QUADS; quad2++) { vb_cells_pt[quad2*6].color=quads2[quad2].color; vb_cells_pt[quad2*6].u=quads2[quad2].u; vb_cells_pt[quad2*6].v=quads2[quad2].v; vb_cells_pt[quad2*6].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+1].color=quads2[quad2].color; vb_cells_pt[quad2*6+1].u=quads2[quad2].u; vb_cells_pt[quad2*6+1].v=quads2[quad2].v; vb_cells_pt[quad2*6+1].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+1].pos.x+=100; vb_cells_pt[quad2*6+1].pos.z+=0; vb_cells_pt[quad2*6+2].color=quads2[quad2].color; vb_cells_pt[quad2*6+2].u=quads2[quad2].u; vb_cells_pt[quad2*6+2].v=quads2[quad2].v; vb_cells_pt[quad2*6+2].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+2].pos.x+=100; vb_cells_pt[quad2*6+2].pos.z+=100; vb_cells_pt[quad2*6+3].color=quads2[quad2].color; vb_cells_pt[quad2*6+3].u=quads2[quad2].u; vb_cells_pt[quad2*6+3].v=quads2[quad2].v; vb_cells_pt[quad2*6+3].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+3].pos.x+=0; vb_cells_pt[quad2*6+3].pos.z+=0; vb_cells_pt[quad2*6+4].color=quads2[quad2].color; vb_cells_pt[quad2*6+4].u=quads2[quad2].u; vb_cells_pt[quad2*6+4].v=quads2[quad2].v; vb_cells_pt[quad2*6+4].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+4].pos.x+=100; vb_cells_pt[quad2*6+4].pos.z+=100; vb_cells_pt[quad2*6+5].color=quads2[quad2].color; vb_cells_pt[quad2*6+5].u=quads2[quad2].u; vb_cells_pt[quad2*6+5].v=quads2[quad2].v; vb_cells_pt[quad2*6+5].pos=quads2[quad2].pos; vb_cells_pt[quad2*6+5].pos.x+=0; vb_cells_pt[quad2*6+5].pos.z+=100; } vb_cells->Unlock(); d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CELL_QUADS); //draw quads3[] vb_cells->Lock(0, 3*sizeof(VERTEXCELLS), (void**)&vb_cells_pt, D3DLOCK_DISCARD); //write quad1 contents to buffer //write quad1 contents to buffer for(int quad3=0; quad3<NUM_CELL_QUADS; quad3++) { vb_cells_pt[quad3*6].color=quads3[quad3].color; vb_cells_pt[quad3*6].u=quads3[quad3].u; vb_cells_pt[quad3*6].v=quads3[quad3].v; vb_cells_pt[quad3*6].pos=quads3[quad3].pos; vb_cells_pt[quad3*6+1].color=quads3[quad3].color; vb_cells_pt[quad3*6+1].u=quads3[quad3].u; vb_cells_pt[quad3*6+1].v=quads3[quad3].v; vb_cells_pt[quad3*6+1].pos=quads3[quad3].pos; vb_cells_pt[quad3*6+1].pos.x+=100; vb_cells_pt[quad3*6+1].pos.z+=0; vb_cells_pt[quad3*6+2].color=quads3[quad3].color; vb_cells_pt[quad3*6+2].u=quads3[quad3].u; vb_cells_pt[quad3*6+2].v=quads3[quad3].v; vb_cells_pt[quad3*6+2].pos=quads3[quad3].pos; vb_cells_pt[quad3*6+2].pos.x+=100; vb_cells_pt[quad3*6+2].pos.z+=100; vb_cells_pt[quad3*6+3].color=quads3[quad3].color; vb_cells_pt[quad3*6+3].u=quads3[quad3].u; vb_cells_pt[quad3*6+3].v=quads3[quad3].v; vb_cells_pt[quad3*6+3].pos=quads3[quad3].pos; vb_cells_pt[quad3*6+3].pos.x+=0; vb_cells_pt[quad3*6+3].pos.z+=0; vb_cells_pt[quad3*6+4].color=quads3[quad3].color; vb_cells_pt[quad3*6+4].u=quads3[quad3].u; vb_cells_pt[quad3*6+4].v=quads3[quad3].v; vb_cells_pt[quad3*6+4].pos=quads3[quad3].pos; vb_cells_pt[quad3*6+4].pos.x+=100; vb_cells_pt[quad3*6+4].pos.z+=100; vb_cells_pt[quad3*6+5].color=quads3[quad3].color; vb_cells_pt[quad3*6+5].u=quads3[quad3].u; vb_cells_pt[quad3*6+5].v=quads3[quad3].v; vb_cells_pt[quad3*6+5].pos=quads1[quad3].pos; vb_cells_pt[quad3*6+5].pos.x+=0; vb_cells_pt[quad3*6+5].pos.z+=100; } vb_cells->Unlock(); d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, NUM_CELL_QUADS);
Not only does this run much slower than my old write-to-copy-of-vertex-buffer method, but I don't even see any quads! Plus, this new method seems to be crunching the whole app - my DirectInput starts to read keystates incorrectly, causing the camera to keep moving for a second after I let go of the move key, etc. Can anyone please explain why it does this?
I am amazed at how difficult it has become just to figure out how to draw my quads.
-DrawPrimitiveUP won't work because it's too slow
-Memcpy()'ing a copy of the vertex buffer to the vertex buffer at draw time doesn't work because it behaves strangely and won't work properly when I do it more than once with multiple copies - something I must be able to do.) - See my previous post.
Can anyone please help me out here? All I want to do is to be able to call some sort of AddQuadToBeDrawn() function from anywhere within the game (within the handling of cells, shots, lightning, weather, etc.) I cannot just lock the vertex buffer and then iterate through all my entities, writing directly to the vbuffer, for two reasons.
#1, the quads need to be split into 6 different DrawPrimitive() calls based on whether they are additive/subtractive/source_blend/high/low.
#2, adding quads in my game is more complicated than just "draw a quad for each entity" - in short, if I were to just write directly to the vbuffer while it was locked, there would need to be a large amount of game logic run while the vbuffer was locked, which would obviously be bad.
I'm sorry to keep bothering you all about this. . .
Thanks!
-synth_cat
Greg Philbrick, Game Developercoming soon . . . Overhauled CellZenith