Fixed instancing.

This commit is contained in:
bkaradzic 2013-07-25 23:13:48 -07:00
parent df3c562d47
commit b1901ae776
4 changed files with 65 additions and 45 deletions

View file

@ -408,14 +408,16 @@ int _main_(int /*_argc*/, char** /*_argv*/)
bgfx::setViewTransform(0, view, proj); bgfx::setViewTransform(0, view, proj);
const uint16_t instanceStride = 64; const uint16_t instanceStride = 64;
const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(9, instanceStride); const uint16_t numInstances = 3;
if (NULL != idb)
{
uint8_t* data = idb->data;
// Write instance data for 3x3 cubes. // Write instance data for 3x3 cubes.
for (uint32_t yy = 0; yy < 3; ++yy) for (uint32_t yy = 0; yy < 3; ++yy)
{
const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(numInstances, instanceStride);
if (NULL != idb)
{ {
uint8_t* data = idb->data;
for (uint32_t xx = 0; xx < 3; ++xx) for (uint32_t xx = 0; xx < 3; ++xx)
{ {
float* mtx = (float*)data; float* mtx = (float*)data;
@ -424,43 +426,35 @@ int _main_(int /*_argc*/, char** /*_argv*/)
mtx[13] = -3.0f + float(yy)*3.0f; mtx[13] = -3.0f + float(yy)*3.0f;
mtx[14] = 0.0f; mtx[14] = 0.0f;
float* color = (float*)&data[64];
color[0] = sin(time+float(xx)/11.0f)*0.5f+0.5f;
color[1] = cos(time+float(yy)/11.0f)*0.5f+0.5f;
color[2] = sin(time*3.0f)*0.5f+0.5f;
color[3] = 1.0f;
data += instanceStride; data += instanceStride;
} }
// Set vertex and fragment shaders.
bgfx::setProgram(program);
// Set vertex and index buffer.
bgfx::setVertexBuffer(vbh);
bgfx::setIndexBuffer(ibh);
// Set instance data buffer.
bgfx::setInstanceDataBuffer(idb, numInstances);
// Bind textures.
bgfx::setTexture(0, u_texColor, textureColor);
bgfx::setTexture(1, u_texNormal, textureNormal);
// Set render states.
bgfx::setState(0
|BGFX_STATE_RGB_WRITE
|BGFX_STATE_ALPHA_WRITE
|BGFX_STATE_DEPTH_WRITE
|BGFX_STATE_DEPTH_TEST_LESS
|BGFX_STATE_MSAA
);
// Submit primitive for rendering to view 0.
bgfx::submit(0);
} }
uint16_t numInstances = (uint16_t)( (data - idb->data)/instanceStride);
// Set vertex and fragment shaders.
bgfx::setProgram(program);
// Set vertex and index buffer.
bgfx::setVertexBuffer(vbh);
bgfx::setIndexBuffer(ibh);
// Set instance data buffer.
bgfx::setInstanceDataBuffer(idb, numInstances);
// Bind textures.
bgfx::setTexture(0, u_texColor, textureColor);
bgfx::setTexture(1, u_texNormal, textureNormal);
// Set render states.
bgfx::setState(0
|BGFX_STATE_RGB_WRITE
|BGFX_STATE_ALPHA_WRITE
|BGFX_STATE_DEPTH_WRITE
|BGFX_STATE_DEPTH_TEST_LESS
|BGFX_STATE_MSAA
);
// Submit primitive for rendering to view 0.
bgfx::submit(0);
} }
// Advance to next frame. Rendering thread will be kicked to // Advance to next frame. Rendering thread will be kicked to

View file

@ -2672,9 +2672,16 @@ namespace bgfx
} }
} }
if (currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx || programChanged) if (programChanged
|| currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx
|| currentState.m_instanceDataBuffer.idx != state.m_instanceDataBuffer.idx
|| currentState.m_instanceDataOffset != state.m_instanceDataOffset
|| currentState.m_instanceDataStride != state.m_instanceDataStride)
{ {
currentState.m_vertexBuffer = state.m_vertexBuffer; currentState.m_vertexBuffer = state.m_vertexBuffer;
currentState.m_instanceDataBuffer.idx = state.m_instanceDataBuffer.idx;
currentState.m_instanceDataOffset = state.m_instanceDataOffset;
currentState.m_instanceDataStride = state.m_instanceDataStride;
uint16_t handle = state.m_vertexBuffer.idx; uint16_t handle = state.m_vertexBuffer.idx;
if (invalidHandle != handle) if (invalidHandle != handle)

View file

@ -2679,9 +2679,16 @@ namespace bgfx
} }
} }
if (currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx || programChanged) if (programChanged
|| currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx
|| currentState.m_instanceDataBuffer.idx != state.m_instanceDataBuffer.idx
|| currentState.m_instanceDataOffset != state.m_instanceDataOffset
|| currentState.m_instanceDataStride != state.m_instanceDataStride)
{ {
currentState.m_vertexBuffer = state.m_vertexBuffer; currentState.m_vertexBuffer = state.m_vertexBuffer;
currentState.m_instanceDataBuffer.idx = state.m_instanceDataBuffer.idx;
currentState.m_instanceDataOffset = state.m_instanceDataOffset;
currentState.m_instanceDataStride = state.m_instanceDataStride;
uint16_t handle = state.m_vertexBuffer.idx; uint16_t handle = state.m_vertexBuffer.idx;
if (invalidHandle != handle) if (invalidHandle != handle)

View file

@ -2754,7 +2754,7 @@ namespace bgfx
void Context::rendererSubmit() void Context::rendererSubmit()
{ {
const GLuint defaultVao = s_renderCtx.m_vaoSupport; const GLuint defaultVao = s_renderCtx.m_vao;
if (0 != defaultVao) if (0 != defaultVao)
{ {
GL_CHECK(glBindVertexArray(defaultVao) ); GL_CHECK(glBindVertexArray(defaultVao) );
@ -3274,18 +3274,24 @@ namespace bgfx
if (programChanged if (programChanged
|| currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx || currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx
|| currentState.m_indexBuffer.idx != state.m_indexBuffer.idx || currentState.m_indexBuffer.idx != state.m_indexBuffer.idx
|| currentState.m_instanceDataBuffer.idx != state.m_instanceDataBuffer.idx) || currentState.m_instanceDataBuffer.idx != state.m_instanceDataBuffer.idx
|| currentState.m_instanceDataOffset != state.m_instanceDataOffset
|| currentState.m_instanceDataStride != state.m_instanceDataStride)
{ {
bx::HashMurmur2A murmur; bx::HashMurmur2A murmur;
murmur.begin(); murmur.begin();
murmur.add(state.m_vertexBuffer.idx); murmur.add(state.m_vertexBuffer.idx);
murmur.add(state.m_indexBuffer.idx); murmur.add(state.m_indexBuffer.idx);
murmur.add(state.m_instanceDataBuffer.idx); murmur.add(state.m_instanceDataBuffer.idx);
murmur.add(state.m_instanceDataOffset);
murmur.add(state.m_instanceDataStride);
murmur.add(programIdx); murmur.add(programIdx);
uint32_t hash = murmur.end(); uint32_t hash = murmur.end();
currentState.m_vertexBuffer = state.m_vertexBuffer; currentState.m_vertexBuffer = state.m_vertexBuffer;
currentState.m_indexBuffer = state.m_indexBuffer; currentState.m_indexBuffer = state.m_indexBuffer;
currentState.m_instanceDataOffset = state.m_instanceDataOffset;
currentState.m_instanceDataStride = state.m_instanceDataStride;
baseVertex = state.m_startVertex; baseVertex = state.m_startVertex;
GLuint id = s_renderCtx.m_vaoStateCache.find(hash); GLuint id = s_renderCtx.m_vaoStateCache.find(hash);
@ -3351,9 +3357,15 @@ namespace bgfx
} }
if (programChanged if (programChanged
|| currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx) || currentState.m_vertexBuffer.idx != state.m_vertexBuffer.idx
|| currentState.m_instanceDataBuffer.idx != state.m_instanceDataBuffer.idx
|| currentState.m_instanceDataOffset != state.m_instanceDataOffset
|| currentState.m_instanceDataStride != state.m_instanceDataStride)
{ {
currentState.m_vertexBuffer = state.m_vertexBuffer; currentState.m_vertexBuffer = state.m_vertexBuffer;
currentState.m_instanceDataBuffer.idx = state.m_instanceDataBuffer.idx;
currentState.m_instanceDataOffset = state.m_instanceDataOffset;
currentState.m_instanceDataStride = state.m_instanceDataStride;
uint16_t handle = state.m_vertexBuffer.idx; uint16_t handle = state.m_vertexBuffer.idx;
if (invalidHandle != handle) if (invalidHandle != handle)