9

这是交易:如果我留下代码glGenBuffers(1, vertexBuffers),代码编译并工作。但是,我认为它应该是2因为它vertexBuffers是 2 号。

我错过了什么吗?

下面的代码:

-(void)drawRect:(NSRect)dirtyRect
{    
    // get program ID for shader program
    GLuint programID = [self loadShaders];

    // get new dimensions
    NSSize dim = [self frame].size;

    // clear the background with color
    glClearColor(0.0, 0.0, 0.0, 0.4);
    glDepthRange(0.1, 100.0);
    glViewport(0, 0, dim.width, dim.height);
    glClear(GL_COLOR_BUFFER_BIT);

    // vertex data
    GLfloat vertexPositionData[] = {-dim.width/2, -dim.height/2, 0.0, 5.0,
        dim.width/2, -dim.height/2, 0.0, 5.0,
        0.0, dim.height/2, 0.0, 5.0};

    GLfloat vertexColorData[] = {1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 1.0, 0.5};

    GLfloat scaleMatrixData[] = {1/(dim.width/2), 0.0, 0.0, 0.0,
        0.0, 1/(dim.height/2), 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0,
        0.0, 0.0, 0.0, 1.0};

    GLint scaleMatrixUniform = glGetUniformLocation(programID, "scaleMatrix");

    // generate a buffer for our triangle
    glGenBuffers(1, vertexBuffers);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositionData), vertexPositionData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColorData), vertexColorData, GL_STATIC_DRAW);
    //glBindBuffer(GL_ARRAY_BUFFER, 0);

    glUseProgram(programID);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
    glEnableVertexAttribArray(VERTEX_POS_INDEX);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
    glEnableVertexAttribArray(VERTEX_COLOR_INDEX);
    glVertexAttribPointer(VERTEX_POS_INDEX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, 0, vertexPositionData);
    glVertexAttribPointer(VERTEX_COLOR_INDEX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, 0, vertexColorData);

    glUniformMatrix4fv(scaleMatrixUniform, 1, GL_FALSE, scaleMatrixData);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glUseProgram(0);

    // flush buffer
    glFlush();
    [[self openGLContext] flushBuffer];
}
4

3 回答 3

29

glGenBuffers不像你期望的那样工作。当您调用 时glGenBuffers,它实际上并没有创建任何东西。它只返回当前未用作缓冲区名称的整数列表。

在您调用glBindBuffer. 因此,您可以组成您喜欢的任何整数并将其传递给 glBindBuffer ,并且将在该索引处创建一个有效的缓冲区。glGenBuffers实际上根本不需要,它只是作为一个方便的函数来给你一个未使用的整数。

因此,如果您只是创建一个随机整数数组,只要它们没有重叠,您就可以将其用作缓冲区列表而无需调用glGenBuffers. 这就是为什么无论您告诉 glGenBuffers 创建 1 个缓冲区还是 2 个缓冲区,您的代码都可以工作的原因。只要您有两个具有两个不同名称的缓冲区,整数的来源就无关紧要。

一个小示范:

int buf;
glGenBuffers(1, &buf);
glIsBuffer(buf); //FALSE - buffer has not been created yet
glBindBuffer(GL_ARRAY_BUFFER, buf);
glIsBuffer(buf); //TRUE - buffer created on bind
于 2012-08-24T05:14:15.717 回答
10

假设它vertexBuffers被声明为:

GLuint vertexBuffers[2];

那么您的代码可能并没有完全按照您的想法进行。第一个参数glGenBuffers()是您要生成的缓冲区的数量,第二个参数是指向那么多缓冲区的数组的指针。所以你可能想做:

glGenBuffers (2, vertexBuffers);

这告诉 OpenGL 生成 2 个缓冲区名称,并将它们存储在内存中从vertexBuffers.

于 2012-08-24T04:41:27.280 回答
2

我昨天想通了,我需要在每个 glBufferData(...) 之后执行 glBindBuffer(GL_ARRAY_BUFFER, 0)。

于 2012-08-26T00:18:11.640 回答