| Render Buffer Ranges |
02 November 2004, 5:15AM |
|
I was fooling with my renderer a bit more tonight, and added some buffer management functionality
for static data.
One of the goals is to have as few vertex buffers around as possible, primarily to
save on switching between them and to make sure rendering is done in batches.
My aim was to create a simple-to-use
interface for managing large vertex buffers from which any number of smaller objects can be rendered.
I implemented a couple different ideas, in search of a good interface.
The one I settled on (for now) uses a VertexBufferRange and IndexBufferRange
to simplify the above.
So in cases where the user doesn't want to manage vertex buffers directly yet still gain
the advantages of 'big buffers', something like the following code in the new system would be used:
VertexBufferRange vbr1; renderer->createVertexBufferRange(&vbr1, RVFORMAT( RVF_XYZ, RVF_DIFFUSE, 0 ), 3);
VertexBufferRange vbr2; renderer->createVertexBufferRange(&vbr2, RVFORMAT( RVF_XYZ, RVF_DIFFUSE, 0 ), 3);
// orange triangle; dword color = RGBCOLOR(255, 128, 0);
vbr1.ptr()->lock(vbr1.start(), vbr1.count());
vbr1.ptr()->pushXYZ(0, 0, 100); vbr1.ptr()->pushDiffuse(color); vbr1.ptr()->sealVertex();
vbr1.ptr()->pushXYZ(-50, 0, 100); vbr1.ptr()->pushDiffuse(color); vbr1.ptr()->sealVertex();
vbr1.ptr()->pushXYZ(-50, 50, 100); vbr1.ptr()->pushDiffuse(color); vbr1.ptr()->sealVertex();
vbr1.ptr()->unlock();
// blue triangle; color = RGBCOLOR(128, 128, 255);
vbr2.ptr()->lock(vbr2.start(), vbr2.count());
vbr2.ptr()->pushXYZ(0, 0, 100); vbr2.ptr()->pushDiffuse(color); vbr2.ptr()->sealVertex();
vbr2.ptr()->pushXYZ(50, 0, 100); vbr2.ptr()->pushDiffuse(color); vbr2.ptr()->sealVertex();
vbr2.ptr()->pushXYZ(50, -50, 100); vbr2.ptr()->pushDiffuse(color); vbr2.ptr()->sealVertex();
vbr2.ptr()->unlock(); |
This creates two 'vertex buffer ranges', one for each "mesh", which can be used a lot like normal vertex buffers.
The point is just to hide away the fact that both of these ranges are part of the same vertex buffer.
So in the way I've set up a single triangle for each range above, the
exact same kind of set up code could take place in a mesh loader (for example)
where the full list of triangles is copied over to either of the ranges
instead of only one.
And then an index buffer is created similarly:
IndexBufferRange ibr;
renderer->createIndexBufferRange(&ibr, INDEX_BUFFER_16, 3);
ibr.ptr()->lock(0, 3); ibr.ptr()->pushIndex16(0); ibr.ptr()->pushIndex16(1); ibr.ptr()->pushIndex16(2);
ibr.ptr()->unlock(); |
And then later on at render time, something like the following would occur:
renderer->render(&vbr1, &ibr); renderer->render(&vbr2, &ibr); |
So interface-wise, its a lot like working with separate VBs, but behind the scenes the vertex buffers are managed
and optimized by the renderer. In my particular implementation there's one large static vertex buffer
for each different vertex format.
I just kind of threw this interface together, so I'm not certain I'm not forgetting any important
considerations, but I'll see how it works out when I get the model loaders and so on integrated.
Complete List Of Journal Updates:
Auto-Terrain Texturing (15 November 2004, 12:27PM)
On Orientation Interfaces (14 November 2004, 7:30PM)
Basic Terrain Generation (10 November 2004, 4:39AM)
Engine Tool Interface (07 November 2004, 2:37AM)
Render Buffer Ranges (02 November 2004, 5:15AM)
wxWidgets GUI Toolkit (29 October 2004, 2:31AM)
Generic Rendering Interfaces (27 October 2004, 6:55PM)
Source Documentation with Doxygen (25 October 2004, 6:34PM)
Signs of Life? (25 October 2004, 5:14PM)
Key Value Scripts (08 November 2003, 4:32PM)
Octrees for Potential Colliders (01 November 2003, 4:09PM)
Flexporter and Game Levels (31 October 2003, 12:14PM)
New Project and More Updates (31 October 2003, 6:14AM)
HSL Color Space (07 May 2003, 6:14AM)
A Couple Graphics Books (02 December 2002, 5:12PM)
Texture Detail Using Colored Triangles (02 November 2002, 3:26AM)
Voxel Mesh Creation and Rendering (27 October 2002, 11:30AM)
Development Journal (25 October 2002, 10:57AM)
|
|