4

私は知っています、それはかなりイライラします。OpenGLアプリケーションに何も表示されません。表示されるのは空のビューポートだけです。

私が最初にアプリケーションを書き始めたとき、私は手動で頂点を描画していました(を使用してGL_QUADS)、そしてすべてがうまくいきました。次に、 VBOV ertex B uffer Object)に切り替えることにしました。今は何も機能しません。

頂点の構造は次のとおりです。

struct SimpleVertex
{
    GLfloat x, y;
    GLbyte r, g, b, a;
};

ご覧のとおり、これは非常に単純です。頂点とRGBAカラーデータのx座標とy座標です。頂点とインデックスバッファを埋めるコードは次のとおりです。

const SimpleVertex rect_vertices[] = {
    { -0.8,  0.8, 0, 255, 0, 128 },
    {  0.8,  0.8, 0, 255, 0, 128 },
    {  0.8, -0.8, 0, 255, 0, 128 },
    { -0.8, -0.8, 0, 255, 0, 128 }
};

const GLuint rect_indices[] = {
    0, 1, 2, 3
};

GLuint vertices;
GLuint indices;

glGenBuffers(1, &vertices);
glBindBuffer(GL_ARRAY_BUFFER, vertices);
glBufferData(GL_ARRAY_BUFFER,
             sizeof(rect_vertices),
             rect_vertices,
             GL_STATIC_DRAW);

glGenBuffers(1, &indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
             sizeof(rect_indices),
             rect_indices,
             GL_STATIC_DRAW);

最後になりましたが、間違いなく重要なことですが、長方形を描画するためのコードは次のとおりです。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glBindBuffer(GL_ARRAY_BUFFER, vertices);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glColorPointer(4, GL_BYTE, 0,
               (const GLvoid *)(sizeof(GLfloat) * 2));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, NULL);

glDisable(GL_BLEND);

何もレンダリングされていない理由がわかりません。頂点とカラーのデータは、を使用していた以前のバージョンから基本的に変更されていませんglVertex2f()

4

2 に答える 2

3

gl*Pointer関数を呼び出すだけでは不十分です。これらの特定の配列からプルする必要があることをOpenGLに通知する必要があります。組み込み配列(glVertexPointer、glColorPointerなど)の場合glEnableClientState()、問題の特定の配列にを使用します。

例えば:

glBindBuffer(GL_ARRAY_BUFFER, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_BYTE, 0, (const GLvoid *)(sizeof(GLfloat) * 2));

それはより良い結果を提供するはずです。

glDisableClientState()レンダリングが終了したら、これらの配列でも使用する必要があります。

于 2011-07-26T23:51:59.637 に答える
1

あなたはいくつかのステップを逃しているようです:

  • VAOバインディング
  • クライアント状態(VBO)の有効化(例:glEnableClientState(GL_VERTEX_ARRAY)
于 2011-07-26T23:36:12.050 に答える