1

頂点データを VBO に変換しようとすると、常に黒い画面が表示されます...実装の何が問題なのかわかりません。私のレンダリングでは、bindBuffer 呼び出しを削除し、頂点ポインターを 0 ではなく glVertexPointer に渡すと、nbVertices と頂点が適切に設定されます。

Vec3 定義:

struct vec3
{
    float x;
    float y;
    float z;
}

作成 :

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * this->nbVertices, vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);

レンダリング:

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// draw cube
glScalef(scaleX, scaleY, scaleZ);

glRotatef(rotX, 1, 0, 0);
glRotatef(rotY, 0, 1, 0);
glRotatef(rotZ, 0, 0, 1);

for (int i=0; i<nbTextures; i++)
{
    glBindTexture(GL_TEXTURE_2D, textureIds[i]);

    glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 0, this->normals);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, this->nbVertices);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);
4

1 に答える 1

2

問題は、VBO とクライアント側の配列を混在させていることです。これは問題ではありませんが、VBO がバインドされている場合、クライアント側の配列へのポインターを指定することはできません (頂点配列を除く他のすべての配列の場合と同様)。ポインターは、バッファーへのオフセットとして扱われます。

したがって、次の呼び出しの後にバッファのバインドを解除しますglVertexPointer

glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0/*this->vertices*/);
glBindBuffer(GL_ARRAY_BUFFER,0);

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, this->normals);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, this->texCoords);

または、VBO とクライアント側配列を混在させず、すべての属性に VBO を使用することをお勧めします。各属性に同じ VBO を使用し、個々の配列を次々に配置することができます。この場合、オフセットを少し操作する必要があります。または、各頂点の属性データを次々に配置する必要があります (多くの場合、最良の方法です)。 )、ストライド パラメータも操作する必要があります。ただし、属性ごとに異なる VBO を使用することもできますが、この場合gl...Pointer、上記のように、 を呼び出すたびに正しい VBO をバインドすることを忘れないでください。

于 2012-06-28T14:15:52.350 に答える