当顶点数量增加时,OpenGL应用程序崩溃

时间:2018-11-16 17:18:07

标签: c++ qt opengl

我正在开发OpenGL应用程序,c ++和Qt5

我写了基本的渲染引擎,当顶点数量相对较少时,一切都很好,它可以绘制,平移,缩放等。然后,我增加了顶点数量,并且由于分段错误而导致应用程序崩溃。在我的Linux机器上,当有65万个顶点(数量浮动,可能为+/- 50)时,会发生这种情况,而在Windows笔记本电脑上则更少。当然,首先想到的是内存溢出,但是在创建并填充了接近崩溃级别的点数后,我得到了2Gb GPU内存和1.6Gb空闲内存(从NVX扩展获取的内存统计信息,因此应该足够可靠) )。 我前段时间用Python编写了代码,做了同样的事情,并且在同一台笔记本电脑上工作得很好。你知道我现在在做什么错吗?

以下是一些代码段:

顶点着色器(尽可能简化):

#version 330
uniform mat4 projection;
in vec3 position;

out vec4 a_facecolor;
void main()
{
    gl_Position = projection*vec4(position,1);
    gl_PointSize = 5;
    a_facecolor = vec4(1,0,0,1);
}

片段:

in vec4 a_facecolor;

void main(void)
{
    gl_FragColor = a_facecolor; 
}

数组初始化:

#define N_POINTS 600000
....
QVector3D data[N_POINTS];
for (long i=0; i < N_POINTS; i++){
    data[i] = QVector3D((qrand()%100-50)/50.0f*2,
                        (qrand()%100-50)/50.0f*2,
                        (qrand()%100-50)/50.0f*1);
}
buffer.create();
buffer.bind();
buffer.allocate(data, sizeof(data)); 

渲染:

program.bind();
buffer.bind();
program.setUniformValue("projection", projection*transform);
int vertexLocation = program.attributeLocation("position");
program.enableAttributeArray(vertexLocation);
program.setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3);
glDrawArrays(GL_LINE_STRIP,0,N_POINTS);
glDrawArrays(GL_POINTS,0,N_POINTS);

1 个答案:

答案 0 :(得分:0)

基于评论的答案:

data是在堆栈上分配的数组。如果它的大小大于允许的最大堆栈大小(通常比可用的总内存小得多),则程序将因堆栈溢出而崩溃。

要使用堆分配,请尝试:

std::vector<QVector3D> data(N_POINTS);

然后:

buffer.allocate(data.data(), sizeof(QVector3D)*data.size());