我正在遍历一些网格,每个网格都存储在自己的GL_ARRAY_BUFFER中,但它们共享同一个glVertexAttribPointer结构。我通过for循环遍历每个渲染/绘制过程:
if (sConfig.mRendering.isRenderTypeActive(RENDER_TYPE_SINGLE_MESH) ||
sConfig.mRendering.isRenderTypeActive(RENDER_TYPE_TWO_MESH)) {
const int mesh_count = sConfig.mRendering.isRenderTypeActive(RENDER_TYPE_TWO_MESH) ? 2 : 1;
for (int i = 0; i < mesh_count; i++) {
std::lock_guard<std::mutex> lock(mModelDataMutex[i]);
mUniV_VertexTransform->setValue(mModelTransform[i]);
glBindBuffer(GL_ARRAY_BUFFER, mVBOs[i]); CHECK_GL_ERR;
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)mVertexCount[i]); CHECK_GL_ERR;
}
}
使用以下函数的几个调用来为每个VBO设置数据:
bool ::updateModelData(const RenderCloud& data, VERTEX_BUFFER_ID id /*= VBID_MESH_0*/)
{
if (id < VBID_COUNT)
{
std::lock_guard<std::mutex> lock(mModelDataMutex[id]);
// Bind Point VBO
glBindBuffer(GL_ARRAY_BUFFER, mVBOs[id]); CHECK_GL_ERR_RET;
// Set coordinate attribute
glVertexAttribPointer(BTID_COORDS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)BT_COORDS_OFFSET); CHECK_GL_ERR_RET;
glEnableVertexAttribArray(BTID_COORDS); CHECK_GL_ERR_RET;
// Set the normals attribute
glVertexAttribPointer(BTID_NORMALS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT_NORMALS_OFFSET)); CHECK_GL_ERR_RET;
glEnableVertexAttribArray(BTID_NORMALS); CHECK_GL_ERR_RET;
// Set the colors attribute
glVertexAttribPointer(BTID_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT_COLOR_OFFSET)); CHECK_GL_ERR_RET;
glEnableVertexAttribArray(BTID_COLOR); CHECK_GL_ERR_RET;
// Copy Data
glBufferData(GL_ARRAY_BUFFER, data.pts.size() * data.elemSize(), data.pts.data(), GL_STATIC_DRAW); CHECK_GL_ERR_RET;
mVertexCount[id] = data.pts.size();
// Unbind buffer
glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERR_RET;
return true;
}
return false;
}
我可以验证两个VBO中都有数据,但是在for循环中只有第一个VBO使用了glDrawArrays()进行渲染。
它们共享同一个几何着色器,然后被延迟渲染堆栈用于应用效果。
每个glDrawArrays()调用是否需要其自己的几何着色器,只要它们都共享相同的绘制缓冲区?