C++ OpenGL——多个glDrawArrays()调用只显示第一个的结果?
因此,我迭代了几个网格,每个网格存储在自己的GL_数组_缓冲区中,但都共享相同的glvertexattributepointer结构。我在for循环中迭代每个渲染/绘制过程:C++ OpenGL——多个glDrawArrays()调用只显示第一个的结果?,c++,c,windows,opengl,C++,C,Windows,Opengl,因此,我迭代了几个网格,每个网格存储在自己的GL_数组_缓冲区中,但都共享相同的glvertexattributepointer结构。我在for循环中迭代每个渲染/绘制过程: if (sConfig.mRendering.isRenderTypeActive(RENDER_TYPE_SINGLE_MESH) || sConfig.mRendering.isRenderTypeActive(RENDER_TYPE_TWO_MESH)) { const int mesh_count
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;
}
}
if(sConfig.mRendering.isRenderTypeActive(渲染类型\单个\网格)|
sConfig.mRendering.isRenderTypeActive(渲染类型两个网格)){
const int mesh\u count=sConfig.mrending.isRenderTypeActive(渲染类型两个网格)?2:1;
对于(int i=0;isetValue(mModelTransform[i]);
glBindBuffer(GL_数组_BUFFER,mVBOs[i]);检查GL_ERR;
glDrawArrays(GL_三角形,0,(GLsizei)mVertexCount[i]);检查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;
}
bool::updateModelData(const RenderCloud&data,VERTEX\u BUFFER\u ID/*=VBID\u MESH\u 0*/)
{
如果(id
我可以验证两个VBO的数据是否都存在,但只有for循环中的第一个VBO使用glDrawArrays()进行渲染
它们共享shame几何体着色器,延迟渲染堆栈随后使用该着色器应用效果
每个glDrawArrays()调用是否都需要自己的几何体着色器实例,只要它们都共享相同的绘制缓冲区?定义通用顶点属性数据数组的不是绑定顶点缓冲区对象,而是存储在默认顶点数组对象中的状态 调用时,将定义常规顶点属性数据的数组。如果此时绑定了数组缓冲区,那么数组定义将引用缓冲区对象 这意味着您必须在绘制对象之前切换阵列定义:
glBindBuffer(GL_ARRAY_BUFFER, mVBOs[id]);
glVertexAttribPointer(BTID_COORDS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)BT_COORDS_OFFSET);
glEnableVertexAttribArray(BTID_COORDS);
glVertexAttribPointer(BTID_NORMALS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT_NORMALS_OFFSET));
glEnableVertexAttribArray(BTID_NORMALS);
glVertexAttribPointer(BTID_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT_COLOR_OFFSET));
glEnableVertexAttribArray(BTID_COLOR);
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)mVertexCount[i]);
glBindBuffer(GL_ARRAY_BUFFER, 0);
但我建议使用一种新的方法。顶点数组对象存储常规顶点数组定义的状态:
GLuint vao[VBID_COUNT];
....
glGenVertexArrays( 1, vao[i] );
glBindVertexArray( vao[i] );
glBindBuffer(GL_ARRAY_BUFFER, mVBOs[id]);
glVertexAttribPointer(BTID_COORDS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)BT_COORDS_OFFSET);
glEnableVertexAttribArray(BTID_COORDS);
glVertexAttribPointer(BTID_NORMALS, 3, GL_FLOAT, GL_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT_NORMALS_OFFSET));
glEnableVertexAttribArray(BTID_NORMALS);
glVertexAttribPointer(BTID_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT_COLOR_OFFSET));
glEnableVertexAttribArray(BTID_COLOR);
glBufferData(GL_ARRAY_BUFFER, data.pts.size() * data.elemSize(), data.pts.data(), GL_STATIC_DRAW);
mVertexCount[id] = data.pts.size();
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray( 0 );
您正在使用哪个版本的OpenGL(创建上下文时)?如果你要求一个核心配置文件(对于OGL>3.1),那么你还需要一个配置文件,并在调用之前绑定它。实际上,我似乎创造了VAO,但似乎从未在任何地方使用过它们。这很奇怪,因为它使用单一网格的时间太长了。我是否正确地假设它只是默认运行时绑定的VAO(0?)?请解决您的不确定性:OGL上下文类型和版本,VAO使用情况。行为可能会因这些问题而改变。
glBindVertexArray( vao[i] );
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)mVertexCount[i]);
glBindVertexArray( 0 );