不使用VBO时,OpenGL应用程序崩溃

时间:2014-09-11 20:42:26

标签: opengl-es-2.0 vao

我试图在OpenGL ES 2.0中不使用VBO来绘制对象。我的代码往往会不时地崩溃应用程序(并非总是如此,甚至没有任何改变)。以下是代码。我认为问题是我只启用m_distLocation而不向shader发送任何数据。正确设置所有均匀值。我认为问题只出在属性变量(m_posAttr和m_distLocation),绑定中。

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glEnableVertexAttribArray(m_posAttr);
glEnableVertexAttribArray(m_distLocation); 

int      posAttrSize           = sizeof(float) * 2;
GLintptr posAttrStart          = reinterpret_cast<GLintptr>(&vertices[0]);

glVertexAttribPointer(m_posAttr,      2, GL_FLOAT, GL_FALSE, posAttrSize, reinterpret_cast<GLvoid*>(posAttrStart));
glVertexAttribPointer(m_distLocation, 0, GL_FLOAT, GL_FALSE, 0, 0);

glBindAttribLocation(m_programID, m_posAttr, "posAttr" );
glBindAttribLocation(m_programID, m_distLocation, "distance" );

glUniform1i(m_patternLocation, -1);
glUniform4fv(m_colorAttr, 1, vColor);
glUniform1f(m_depthAttr, z);
glUniform1f(m_zoom, _zoom / 100);
glUniform2fv(m_scale, 1, _scale);
glUniform2fv(m_translate, 1, _trans);
glUniform1f(m_theta, _theta);


glDrawArrays(et, offsetInBytesFill, nVerticesFill );
glDisableVertexAttribArray(m_posAttr);
glDisableVertexAttribArray(m_distLocation);

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:1)

发布的代码片段存在许多可疑方面:

  • glBindAttribLocation()仅在glLinkProgram()之前调用时生效。否则,链接时将自动分配位置,除非重新链接程序,否则无法更改位置。要获取已分配的位置,您可以使用以下命令替换这些呼叫:

    m_posAttr = glGetAttribLocation(m_programID, "posAttr");
    m_distLocation = glGetAttribLocation(m_programID, "distance");
    

    显然需要在使用这些值之前放置这些语句。

  • glVertexAttribPointer()调用的第二个参数是非法的:

    glVertexAttribPointer(m_distLocation, 0, GL_FLOAT, GL_FALSE, 0, 0);
    

    第二个参数是属性中的组件数,需要为1,2,3或4.如果属性是标量浮点数,顾名思义,正确的值将为1。

  • 在同一个调用中,由于您没有使用VBO,因此最后一个参数必须是有效指针。假如distances是距离值的数组/向量,则调用应如下所示:

    glVertexAttribPointer(m_distLocation, 1, GL_FLOAT, GL_FALSE, 0, &distances[0]);
    
  • 根据变量名称的建议,这看起来也可能是错误的:

    glDrawArrays(et, offsetInBytesFill, nVerticesFill);
    

    第二个参数是要绘制的第一个顶点的索引。它不是以字节为单位测量的。例如,如果在顶点数组中有40个顶点的属性,并且想要从顶点20开始绘制10个顶点(即顶点20到29),则调用将是:

    glDrawArrays(et, 20, 10);