1

VBO に描画させようとしていますが、何も表示されません。私は単一の三角形を描こうとしています (単一の三角形は正しい方向への良い出発点だと私には思えます)。すべてが壊れることなくコンパイルおよび実行されます。

void initGraphics(int width, int height) {
    glViewport(0, 0, width, height);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, width, height, 0.0);
    glMatrixMode(GL_MODELVIEW);
}

GLuint vboId;

void initVbo(void) {
    GLsizei dataSize;
    GLfloat* vertices;
    int vCount = 3;

    dataSize = sizeof(GLfloat) * 3 * vCount;

    vertices = (GLfloat*)malloc(dataSize);

    vertices[0] = 0;
    vertices[1] = 0;
    vertices[2] = 0;

    vertices[3] = 100;
    vertices[4] = 0;
    vertices[5] = 0;

    vertices[6] = 100;
    vertices[7] = 100;
    vertices[8] = 0;

    glewInit();

    glGenBuffersARB(1, &vboId);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);

    glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);

    free(vertices);

    //glDeleteBuffersARB(1, &vboId); // edit #1
}

unsigned int indices[] = { 0, 1, 2 }; // edit #3

void drawVbo(void) {

    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0);
//edit #1, #2
    glDrawElements(GL_TRIANGLES, 3 /*1*/, /*GL_UNSIGNED_BYTE*/ GL_UNSIGNED_INT, &indices);

    glDisableClientState(GL_VERTEX_ARRAY);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
}

これらは呼び出される関数です。私はWindowsで実行していますが、Windows関連のコードをたくさん投稿することを避けています...

編集#1

genpfault の提案を反映するようにコードを修正しました。

編集#2

ニコル・ボーラスの提案を反映するようにコードを修正。

コメント #1

次のコードは機能します (プロジェクションが正しく設定されていることを証明するためだけに):

glBegin(GL_TRIANGLES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(100.0, 0.0, 0.0);
glVertex3f(100.0, 100.0, 0.0);
glEnd();

編集#3

ニコル・ボーラスの提案を反映するようにコードを修正。

更新 #1

変更されたコードが機能するようになりました。glDrawArrays を適切に動作させる方法に興味がありますが...私の実装は次のようになりました。

glDrawArrays(GL_TRIANGLES, 0, 0);

これは私には正しくないようですが、仕様には次のように書かれています:

mode: レンダリングするプリミティブの種類を指定します。記号定数 GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、GL_LINES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_TRIANGLES、GL_QUAD_STRIP、GL_QUADS、および GL_POLYGON が受け入れられます。

first: 有効な配列の開始インデックスを指定します。

count: レンダリングするインデックスの数を指定します。

ニコル・ボーラスが言っていたことに基づいて、インデックスは必要ないはずなので、0, 0 は引数として意味があります。右?

4

2 に答える 2

3
glGenBuffersARB(1, &vboId);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);

free(vertices);
glDeleteBuffersARB(1, &vboId);  // wat

呼び出し後glDeleteBuffersARB()、ポイント先の VBO ID は無効になり、 で使用できなくなりますglBindBufferARB()

また:

glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, &indices);

として定義indicesしたので、の代わりにunsigned int使用する必要があります。GL_UNSIGNED_INTGL_UNSIGNED_BYTE

于 2012-06-15T04:15:38.393 に答える
2
 glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);

ご存知のとおり、三角形は 3 つの頂点で構成されています。1 つ(2 番目のパラメーター)を送信しています。1 つの位置から三角形を描くことはできません。

于 2012-06-15T05:03:37.750 に答える