2012-07-02 4 views
5

OpenGL 4.0を学習しており、OpenGL 4.0とGLSLを使って単純な三角形を描きたいと思います。私はそれを行うには、インターリーブ配列でVAOを使用していますが、結果は表示は私が欲しいものではありません。VAOでインターリーブされた配列を使用する

enter image description here

今、私は自分のコードの一部をポスト:

void SceneBasic::setupVAOInterleavedArrays() 
{ 
    //三角形的顶点和颜色信息数组:混合数组 
    float positionAndColorData[] = { 
     -0.8f, -0.8f, 0.0f,1.0f, 0.0f, 0.0f, 
     0.8f, -0.8f, 0.0f,0.0f, 1.0f, 0.0f, 
     0.0f, 0.8f, 0.0f,0.0f, 0.0f, 1.0f }; 

    //glInterleavedArrays(GL_C3F_V3F,0,positionAndColorData) 

    GLuint vboHandle;//VBO 
    glGenBuffers(1,&vboHandle); 

    glBindBuffer(GL_ARRAY_BUFFER,vboHandle); 
    glBufferData(GL_ARRAY_BUFFER,18 * sizeof(float), 
     positionAndColorData,GL_STATIC_DRAW); 

    //VAO 
    glGenVertexArrays(1,&vaoHandle); 
    glBindVertexArray(vaoHandle); 

    //enable the generic vertex attribute indexes 
    //indicates that the values for the attributes will be accessed 
    //and used for rendering 
    glEnableVertexAttribArray(0);//position 
    glEnableVertexAttribArray(1);//color 

    //make the connection between the buffer objects and the generic 
    //vertex attributes indexes 
    glBindBuffer(GL_ARRAY_BUFFER,vboHandle); 
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),BUFFER_OFFSET(0)); 
    glBindBuffer(GL_ARRAY_BUFFER,vboHandle); 
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),BUFFER_OFFSET(3 * sizeof(float))); 
} 

void SceneBasic::initScene() 
{ 
    compileAndLinkShader(); 

    //setupVAO(); 
    setupVAOInterleavedArrays(); 
} 

void SceneBasic::render() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBindVertexArray(vaoHandle); 
    glDrawArrays(GL_TRIANGLES,0,3); 
    glBindVertexArray(0); 
} 

しかし、私の場合インターリーブされた配列を使用していない、結果は右です:

:私は、インターリーブ配列を使用しないとき enter image description here

これは私のコードの一部であります

void SceneBasic::setupVAO() 
{ 
    //三角形的顶点和颜色信息数组 
    float positionData[] = { 
     -0.8f, -0.8f, 0.0f, 
     0.8f, -0.8f, 0.0f, 
     0.0f, 0.8f, 0.0f }; 
    float colorData[] = { 
     1.0f, 0.0f, 0.0f, 
     0.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 1.0f }; 

    glGenBuffers(2,vboHandles); 
    GLuint positionBufferHandle = vboHandles[0]; 
    GLuint colorBufferHandle = vboHandles[1]; 

    glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle); 
    glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float), 
     positionData,GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle); 
    glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float), 
     colorData,GL_STATIC_DRAW); 

    //VAO 
    glGenVertexArrays(1,&vaoHandle); 
    glBindVertexArray(vaoHandle); 

    //enable the generic vertex attribute indexes 
    //indicates that the values for the attributes will be acessed 
    //and used for rendering 
    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    //make the connection between the buffer objects abd the generic 
    //vertex attributes indexes 
    glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle); 
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(0)); 

    glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle); 
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(0)); 
} 

私はとても興味があります。インターリーブされた配列を使用すると、私のコードが期待した結果を得られないのはなぜですか?

答えて

8

ストライドは間違っています。頂点ごとに6つの要素があるため、ストライドとして6 * sizeof (float)を渡す必要があります。

関連する問題