C++ 奇数访问冲突读取错误/glDrawArrays使用

C++ 奇数访问冲突读取错误/glDrawArrays使用,c++,opengl,rendering,C++,Opengl,Rendering,我不确定这是属于这里还是graphichs编程中……我遇到了一个非常恼人的访问冲突读取错误,我不知道为什么。我试图做的是重构一个关键帧函数(计算两个顶点位置之间的中间位置)。此函数编译后工作正常 glBegin(GL_TRIANGLES); for(int i = 0; i < numTriangles; i++) { MD2Triangle* triangle = triangles + i; for(int j = 0; j < 3; j+

我不确定这是属于这里还是graphichs编程中……我遇到了一个非常恼人的访问冲突读取错误,我不知道为什么。我试图做的是重构一个关键帧函数(计算两个顶点位置之间的中间位置)。此函数编译后工作正常

glBegin(GL_TRIANGLES);
    for(int i = 0; i < numTriangles; i++) {
        MD2Triangle* triangle = triangles + i;
        for(int j = 0; j < 3; j++) {
            MD2Vertex* v1 = frame1->vertices + triangle->vertices[j];
            MD2Vertex* v2 = frame2->vertices + triangle->vertices[j];
            Vec3f pos = v1->pos * (1 - frac) + v2->pos * frac;
            Vec3f normal = v1->normal * (1 - frac) + v2->normal * frac;
            if (normal[0] == 0 && normal[1] == 0 && normal[2] == 0) {
                normal = Vec3f(0, 0, 1);
            }
            glNormal3f(normal[0], normal[1], normal[2]);

            MD2TexCoord* texCoord = texCoords + triangle->texCoords[j];
            glTexCoord2f(texCoord->texCoordX, texCoord->texCoordY);
            glVertex3f(pos[0], pos[1], pos[2]);
        }
    }
glEnd();
在调试器中,两个V似乎没有任何值。。。。到目前为止,函数的行为方式与上面的完全相同,我不明白为什么会发生这种情况

编辑------------------------------------------------------------------------------------

感谢Werner发现问题在于阵列初始化!根据您的建议,我使用std:vector容器重构了函数,并使绘图使用glDrawArrays而不是立即模式。。。。但是帧速率并没有提高性能,反而比以前低了很多!我是否正确/有效地使用了此功能?这是重构的绘图函数:

    for(int i = 0; i < numTriangles; i++) {
        MD2Triangle* triangle = triangles + i;
        for(int j = 0; j < 3; j++) {
            MD2Vertex* v1 = frame1->vertices + triangle->vertices[j];
            MD2Vertex* v2 = frame2->vertices + triangle->vertices[j];
            Vec3f pos = v1->pos * (1 - frac) + v2->pos * frac;
            Vec3f normal = v1->normal * (1 - frac) + v2->normal * frac;
            if (normal[0] == 0 && normal[1] == 0 && normal[2] == 0) {
                normal = Vec3f(0, 0, 1);
            }


            normals.push_back(normal[0]);
            normals.push_back(normal[1]);
            normals.push_back(normal[2]);

            MD2TexCoord* texCoord = texCoords + triangle->texCoords[j];
            textCoords.push_back(texCoord->texCoordX);
            textCoords.push_back(texCoord->texCoordY);

            vertices.push_back(pos[0]);
            vertices.push_back(pos[1]);
            vertices.push_back(pos[2]);
        }

    }


    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, 0, &normals[0]);
    glTexCoordPointer(2, GL_FLOAT, 0, &textCoords[0]); 
    glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);



    glDrawArrays(GL_TRIANGLES, 0, vertices.size()/3);


    glDisableClientState(GL_VERTEX_ARRAY);  // disable vertex arrays
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);

    vertices.clear();
    textCoords.clear();
    normals.clear();
for(int i=0;i顶点+三角形->顶点[j];
MD2Vertex*v2=frame2->顶点+三角形->顶点[j];
Vec3f pos=v1->pos*(1-frac)+v2->pos*frac;
Vec3f normal=v1->normal*(1-frac)+v2->normal*frac;
如果(正常[0]==0和正常[1]==0和正常[2]==0){
正常=Vec3f(0,0,1);
}
法线。推回(法线[0]);
法线。推回(法线[1]);
法线。推回(法线[2]);
MD2TexCoord*texCoord=texCoords+triangle->texCoords[j];
textCoords.向后推(texCoord->texCoordX);
textCoords.向后推(texCoord->texCoordY);
顶点。向后推_(位置[0]);
顶点。推回(位置[1]);
顶点。推回(位置[2]);
}
}
glEnableClientState(GL_普通_阵列);
glEnableClientState(GL_纹理_坐标_阵列);
glEnableClientState(GL_顶点_数组);
glNormalPointer(GL_FLOAT、0和法线[0]);
glTexCoordPointer(2,GL_FLOAT,0,&textCoords[0]);
glVertexPointer(3,GL_FLOAT,0,&顶点[0]);
glDrawArray(GL_三角形,0,顶点.size()/3);
glDisableClientState(GL_顶点_数组);//禁用顶点数组
glDisableClientState(GL_纹理_坐标_数组);
glDisableClientState(GL_NORMAL_数组);
顶点。清除();
textCoords.clear();
normals.clear();
我在这里有什么额外的事吗?因为这确实意味着比glBegin()/End()更有效,对吗


谢谢你的时间和帮助

好的,让我们来回答这个问题。猜测是:


当您不写入索引时,它会崩溃吗?你检查过了吗 未写入超过索引末尾的内容(覆盖其他数据 结构

您的回答是,您创建了一个数组GLfloat index[],因为您事先不知道数组的大小

最好的(执行)解决方案是提前计算数组大小,并适当地创建数组

GLfloat *indices = new GLfloat[calculated_number_of_elements];
...use array...;
delete [] indices;
更好的是,您可以创建一个std::vector:

std::vector<GLfloat> indices(calculated_number_of_elements);
std::向量索引(计算的元素数量);

向量还具有可以动态调整大小的优点。

glBegin()和glEnd()如何?我不擅长OpenGL,但这可能会初始化顶点存储在其中的一些内存?因为我们看不到任何自包含的示例,我们只能猜测,这导致我们进入
MD2Vertex*v1=frame1->顶点+三角形->顶点[j]可能(或v2)导致指针错误。因为我们看不到这行中使用的值是如何产生的,所以我们猜不到多少,只是可能有些东西没有初始化。我确实尝试过,但没有任何效果…从缓冲区中绘制时不需要glBegin/End,我理解。。。。但是谢谢你的支持!您是否尝试编译代码时启用了所有警告和调试信息(在Linux上,这意味着
g++-Wall-g
),并调试程序(在Linux上,使用
gdb
调试器,可能还有
ddd
前端)?当您不写入索引时,它会崩溃吗?您是否检查过没有写入超过索引末尾的内容(覆盖其他数据结构)?
GLfloat *indices = new GLfloat[calculated_number_of_elements];
...use array...;
delete [] indices;
std::vector<GLfloat> indices(calculated_number_of_elements);