Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL——多个glDrawArrays()调用只显示第一个的结果?_C++_C_Windows_Opengl - Fatal编程技术网

C++ OpenGL——多个glDrawArrays()调用只显示第一个的结果?

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

因此,我迭代了几个网格,每个网格存储在自己的GL_数组_缓冲区中,但都共享相同的glvertexattributepointer结构。我在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;
    }
}
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 );