-->

帮助我了解的OpenGL glGenBuffers()(Assist me to understan

2019-07-31 04:01发布

这里是处理:如果我离开的代码glGenBuffers(1, vertexBuffers)代码编译和作品。 但是,我认为它应该是2 ,因为vertexBuffers是大小两种。

我缺少的东西吗?

下面的代码:

-(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];
}

Answer 1:

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


Answer 2:

假设vertexBuffers声明,就像这样:

GLuint vertexBuffers[2];

那么你的代码可能是不太做你的想法。 的第一个参数glGenBuffers()是要生成缓冲区的数目,并且所述第二参数是一个指针,它指向的缓冲区的阵列。 所以,你可能想要做:

glGenBuffers (2, vertexBuffers);

这告诉OpenGL以产生2个缓冲器名称,并将它们存储在存储器中的2个连续位置处开始的地址vertexBuffers



Answer 3:

昨天我想通了这一点,我需要每个glBufferData(...)后做一个glBindBuffer(GL_ARRAY_BUFFER,0)。



文章来源: Assist me to understand OpenGL glGenBuffers()