1

現代のGLSLを学ぼうとしていますが、立方体を表示することさえできません...

これは私がVBOを作成する方法です:

    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
    glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW);
    glNormalPointer(GL_FLOAT, 0, 0L);        

    glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
    glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
    glTexCoordPointer(2, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

これは私がvboをレンダリングする方法です:

    glLoadIdentity();

    glPushAttrib(GL_TRANSFORM_BIT);
    glMatrixMode(GL_MODELVIEW);

    glTranslatef(0f, 0f, camera.zoom);

    glRotatef(camera.rotation.x, 1, 0, 0);
    glRotatef(camera.rotation.y, 0, 1, 0);
    glRotatef(camera.rotation.z, 0, 0, 1);

    glTranslatef(camera.position.x, camera.position.y, camera.position.z);

    glPopAttrib();

    texture.bind();
    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glVertexPointer(3, GL_FLOAT, 0, 0L);
    glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle);
    glNormalPointer(GL_FLOAT, 0, 0L);
    glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
    glTexCoordPointer(2, GL_FLOAT, 0, 0L);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glMaterialf(GL_FRONT, GL_SHININESS, 10f);
    glDrawArrays(GL_TRIANGLES, 0, triangles.size() * 3);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);  
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    TextureImpl.bindNone();

シェーダー プログラムを使用しないか、古い glsl 120 で何かを使用すると、すべて正常にレンダリングされますが、このプログラムを使用すると、キューブが思うように表示されるはずですが、黒い画面が表示されます...

頂点シェーダー プログラム:

#version 330

layout (std140) uniform Matrices {
    mat4 pvm;
} ;

in vec4 position;

out vec4 color;

void main()
{
    gl_Position = pvm * position ;
} 

フラグメント シェーダー プログラム:

#version 330

out vec4 outputF;

void main()
{
    outputF = vec4(1.0, 0.0, 0.0, 1.0);
}

私は何を間違っていますか?最新の glsl でこの基本的なことを行う方法はどこで確認できますか?

4

1 に答える 1

5

ここにあるのは、コミュニケーションの失敗です。

このことを考慮:

glVertexPointer(3, GL_FLOAT, 0, 0L);

わかった。位置データがバッファ オブジェクトによって提供され、頂点ごとに 3 つの浮動小数点数があることを OpenGL に伝えています。いいよ。

positionOpenGL は、この位置データが頂点シェーダーに移動することになっていることをどのように認識しますか?

答え: そうではありません。

glVertexPointerGL 3.1+から削除された機能です。任意の頂点シェーダー入力にデータをフィードしません。削除された頂点シェーダー入力にデータをフィードしますgl_Vertex。これはハードコーディングされています。

一般的に とを介して、一般的な頂点属性を使用する必要がglVertexAttribPointerありglEnableVertexAttribArrayます。また、 VAO を使用する必要があります。

同様に、OpenGL が、削除された行列関数がデータを uniform にフィードすることを望んでいることを知る方法はありませんpvm確かに、これは均一なブロックに入れるため、さらに悪いことです。ユニフォーム ブロックのデータは、ユーザー提供のbuffer objectから取得されることになっています。あなたが提供しなかったもの、および OpenGL が魔法のように提供しないもの。

つまり、古いスタイルの OpenGL コードと最新のスタイルの GLSL を混在させることはできません。古いスタイルの GLSL を ( と を使用gl_Vertexしてgl_ModelViewProjectionMatrix) 使用できますが、最新のスタイルの GLSL は使用していません。

于 2013-03-12T21:13:39.823 に答える