9

これが取り引きです: コードを のままにしておくとglGenBuffers(1, vertexBuffers)、コードはコンパイルされて動作します。でも、サイズは22なのでいいなと思いました。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];
}
4

3 に答える 3

29

glGenBuffers期待どおりに機能しません。を呼び出すとglGenBuffers、実際には何も作成されません。現在バッファ名として使用されていない整数のリストを返すだけです。

実際の「オブジェクト」は、を呼び出すまで作成されませんglBindBuffer。したがって、任意の整数を作成してglBindBufferに渡すだけで、そのインデックスに有効なバッファが作成されます。glGenBuffers実際にはまったく必要ありません。未使用の整数を提供する便利な関数としてあります。

したがって、ランダムな整数の配列を作成するだけで、それらのいずれも重複しない限り、を呼び出さずにバッファのリストとして使用できますglGenBuffers。そのため、glGenBuffersに1つまたは2つのバッファーを作成するように指示しても、コードは機能します。2つの異なる名前の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()は生成するバッファの数で、2 番目の引数はその数のバッファの配列へのポインタです。したがって、おそらくやりたいことは次のとおりです。

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 に答える