OpenGL:线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

时间:2018-09-18 21:44:47

标签: opengl exc-bad-access

我有一组要绘制为三角形的点。在将它们放置在屏幕上之前,我正在使用一个函数来转换它们的位置。但是,在数组上调用转换函数会导致出现上述错误。

    float positions[6] = {
    -0.5f, -0.5f,
    0.0f, 0.5f,
    0.5f, -0.5f
};

//Basic Translate function
void basicTranslate(float Tx, float Ty){
    for(int i=0; i<sizeof(positions); i++){
        if(i % 2 == 0)
            positions[i] += Tx;
        else
            positions[i] += Ty;
    }
}

在处理缓冲区和顶点数组之前翻译函数时会发生错误

    basicTranslate(2, 1);

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
    GLuint vao = 0;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

1 个答案:

答案 0 :(得分:2)

sizeof(positions)给出数据类型float[6]的大小(以字节为单位),即4*6=24
参见sizeof operator

更改循环中的条件以解决问题:

for(int i=0; i<6; i++)

在C ++中,我建议使用std::vectorstd::array,它们都提供一个size()方法,该方法返回容器中元素的数量:

#include <vector>

std::vector<float> positions = {
    -0.5f, -0.5f,
     0.0f,  0.5f,
     0.5f, -0.5f
};

void basicTranslate(float Tx, float Ty)
{
    for(size_t i=0; i<positions.size(); i++)
        positions[i] += (i % 2 == 0) ? Tx : Ty;
}