2011-11-12 8 views
0

私はopenGLでスカイボックスを実装しようとしていますが、何らかの理由で、バックカリングをオフにしないと3つの三角形が表示されない限り正しく描画されません。 Maby私は三角形を右に描いているわけではありませんが、わかりません。三角形を使ったOpenGLのスカイボックス

bool Skybox::onInitialize() 
{ 
    myRadius = 100; 
    setPosition(Vector3(0.0f, 0.0f, 0.0f)); 

    //Initialize color matrix 
    myColors.push_back(Color(1.0f, 0.0f, 0.0f, 1.0f)); 
    myColors.push_back(Color(1.0f, 1.0f, 0.0f, 1.0f)); 
    myColors.push_back(Color(1.0f, 0.5f, 0.0f, 1.0f)); 
    myColors.push_back(Color(0.5f, 0.5f, 0.5f, 1.0f)); 

    //Position the key points of the cube 
    myVertices.push_back(Vertex(-myRadius, -myRadius, myRadius));//0 
    myVertices.push_back(Vertex(-myRadius, -myRadius, -myRadius));//1 
    myVertices.push_back(Vertex(myRadius, -myRadius, -myRadius));//2 
    myVertices.push_back(Vertex(myRadius, -myRadius, myRadius));//3 

    myVertices.push_back(Vertex(-myRadius, myRadius, myRadius));//4 
    myVertices.push_back(Vertex(-myRadius, myRadius, -myRadius));//5 
    myVertices.push_back(Vertex(myRadius, myRadius, -myRadius));//6 
    myVertices.push_back(Vertex(myRadius, myRadius, myRadius));//7 

    //Push back the indices that make up the triangles for each face. 
    //Bottom 
    myIndices.push_back(0); 
    myIndices.push_back(1); 
    myIndices.push_back(2); 
    myIndices.push_back(2); 
    myIndices.push_back(1); 
    myIndices.push_back(0); 

    //Top 
    myIndices.push_back(7); 
    myIndices.push_back(6); 
    myIndices.push_back(4); 
    myIndices.push_back(6); 
    myIndices.push_back(5); 
    myIndices.push_back(4); 

    //Left 
    myIndices.push_back(0); 
    myIndices.push_back(4); 
    myIndices.push_back(1); 
    myIndices.push_back(4); 
    myIndices.push_back(5); 
    myIndices.push_back(1); 

    //Right 
    myIndices.push_back(2); 
    myIndices.push_back(6); 
    myIndices.push_back(3); 
    myIndices.push_back(6); 
    myIndices.push_back(7); 
    myIndices.push_back(3); 

    //Back 
    myIndices.push_back(6); 
    myIndices.push_back(1); 
    myIndices.push_back(5); 
    myIndices.push_back(6); 
    myIndices.push_back(2); 
    myIndices.push_back(1); 

    //Front 
    myIndices.push_back(0); 
    myIndices.push_back(7); 
    myIndices.push_back(4); 
    myIndices.push_back(0); 
    myIndices.push_back(3); 
    myIndices.push_back(7); 

    //Generate Texture Coordinates 
    //Bottom 
    myTexCoords.push_back(TexCoord(0.25, 0)); 
    myTexCoords.push_back(TexCoord(0.25, 0.375)); 
    myTexCoords.push_back(TexCoord(0.5, 0.375)); 
    myTexCoords.push_back(TexCoord(0.5, 0)); 

    //Top 
    myTexCoords.push_back(TexCoord(0.25, 1)); 
    myTexCoords.push_back(TexCoord(0.25, 0.625)); 
    myTexCoords.push_back(TexCoord(0.5, 0.625)); 
    myTexCoords.push_back(TexCoord(0.5, 1)); 

    //Left 
    myTexCoords.push_back(TexCoord(0, 0.625)); 
    myTexCoords.push_back(TexCoord(0.25, 0.625)); 
    myTexCoords.push_back(TexCoord(0.25, 0.375)); 
    myTexCoords.push_back(TexCoord(0, 0.375)); 

    //Right 
    myTexCoords.push_back(TexCoord(0.5, 0.625)); 
    myTexCoords.push_back(TexCoord(0.75, 0.625)); 
    myTexCoords.push_back(TexCoord(0.75, 0.375)); 
    myTexCoords.push_back(TexCoord(0.5, 0.375)); 

    //Back 
    myTexCoords.push_back(TexCoord(0.75, 0.625)); 
    myTexCoords.push_back(TexCoord(1.0, 0.625)); 
    myTexCoords.push_back(TexCoord(1.0, 0.375)); 
    myTexCoords.push_back(TexCoord(0.75, 0.375)); 

    const string vertexShader = (GLSLProgram::glsl130Supported()) ? VERTEX_SHADER_130 : VERTEX_SHADER_120; 
    const string fragmentShader = (GLSLProgram::glsl130Supported()) ? FRAGMENT_SHADER_130 : FRAGMENT_SHADER_120; 

    if (!myTexture.load(SKY_TEXTURE)) 
    { 
     std::cerr << "Could not load the particle texture" << std::endl; 
     return false; 
    } 

    glGenTextures(1, &myTexID); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, myTexID); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, myTexture.getWidth(), 
     myTexture.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 
     myTexture.getImageData()); 


    m_shaderProgram = std::auto_ptr<GLSLProgram>(new GLSLProgram(vertexShader, fragmentShader)); 

    if (!m_shaderProgram->initialize()) 
    { 
     std::cerr << "Could not load the skybox shaders" << std::endl; 
     return false; 
    } 

    m_shaderProgram->bindAttrib(0, "a_Vertex"); 
    m_shaderProgram->bindAttrib(1, "a_Color"); 
    m_shaderProgram->bindAttrib(2, "a_TexCoord0"); 
    m_shaderProgram->linkProgram(); 
    m_shaderProgram->sendUniform("texture0", 0); 

    glGenBuffers(1, &myVertexBuffer); //Generate a buffer for the vertices 
    glBindBuffer(GL_ARRAY_BUFFER, myVertexBuffer); //Bind the vertex buffer 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vector3) * myVertices.size(), &myVertices[0], GL_STATIC_DRAW); //Send the data to OpenGL 

    glGenBuffers(1, &myColorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, myColorBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Color) * myColors.size(), &myColors[0], GL_STATIC_DRAW); //Send the data to OpenGL 

    glGenBuffers(1, &myTexCoordBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, myTexCoordBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(TexCoord) * myTexCoords.size(), &myTexCoords[0], GL_STATIC_DRAW); //Send the data to OpenGL 

    glGenBuffers(1, &myIndexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, myIndexBuffer); //Bind the vertex buffer 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * myIndices.size(), &myIndices[0], GL_STATIC_DRAW); //Send the data to OpenGL 

    return true; 
} 

void Skybox::onRender() const 
{ 
    //glDisable(GL_DEPTH_TEST); 

    //glPushMatrix(); 
    glTranslatef(0.0f, 0.0f, 0.0f); 
    static float modelviewMatrix[16]; 
    static float projectionMatrix[16]; 

    m_shaderProgram->bindShader(); 

    //Get the current matrices from OpenGL 
    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix); 
    glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix); 

    //Enable the point sprite and the automatic texture coordinates 
    glBindTexture(GL_TEXTURE_2D, myTexID); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 
    glEnableVertexAttribArray(2); 

    //Send the modelview and projection matrices to the shaders 
    m_shaderProgram->sendUniform4x4("modelview_matrix", modelviewMatrix); 
    m_shaderProgram->sendUniform4x4("projection_matrix", projectionMatrix); 
    m_shaderProgram->sendUniform("texture0", 0); 

    //Bind the vertex array and set the vertex pointer to point at it 
    glBindBuffer(GL_ARRAY_BUFFER, myVertexBuffer); 
    glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, myColorBuffer); 
    glVertexAttribPointer((GLint)1, 4, GL_FLOAT, GL_FALSE, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, myTexCoordBuffer); 
    glVertexAttribPointer((GLint)2, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    //Bind the index array 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, myIndexBuffer); 


    //glDrawElements(GL_TRIANGLES, myIndices.size(), GL_UNSIGNED_INT, 0); 
    glPointSize(5.0f); 
    glDrawArrays(GL_TRIANGLES, 0, myIndices.size()); 

    glDisableVertexAttribArray(2); 
    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    // glPopMatrix(); 
} 
+2

回答を受け入れる方法を調べることができます。あなたの質問に対する回答の横に緑のチェックマークが付きます。あなたはあなたの質問に対する正解であると感じる答えに対してそれを選択します。あなたはこれまでに質問したことのいずれかのためにこれをしていないので、それらのいくつかを取り上げて適切な回答を受け入れることができます。 –

+0

レンダリングコードはどこですか? VBOに属性をどのようにバインドしますか?頂点データが正しい(私はチェックしなかった)正しい巻線順序であると仮定すると、そのような限られたコードから何が間違っているのかを知ることはかなり困難です。私は "bindAttrib"が何をしているのか分かりませんが、VBOがバインドされていないときに頂点属性(つまりglVertexAttribPointerを呼び出している)を設定していれば、それは動作しません! –

+0

緑色のチェックマークも表示されません。人々はチェックボックスをクリックするように指示し続けますが、どこにあるのかは誰にもわかりません。レンダリングコードを最後に追加しました。 – Katianie

答えて

1

あなたの描画コードは非常に混乱しています。それには多くのことが間違っていますが、それらはすべて一つの基本的な誤解から生まれています。

4色、8位置、および24テクスチャ座標があります。 OpenGLはそれをどうしたらいいのか分からない。

OpenGLは、独自の頂点属性のグループでしか動作しません。したがって、位置とテクスチャ座標がある場合、これらの配列の長さはと等しく、でなければなりません。各テクスチャ座標には、それとペアになる特定の位置があり、その逆もあります。それぞれのポジションには、それとペアになる特定の色があり、その逆もあります。

はい、キューブには8つの異なる位置があります。しかし、あなたは描画していません。頂点(頂点は、属性データの集合です。に位置を含むかもしれません)。あなたは12の三角形を描いています。各三角形には3つの頂点があります。

三角形は、その頂点の頂点属性のすべてを共有する場合にのみ、頂点を共有できます。したがって、2つの三角形(主対角線に沿って)が2つの共有頂点の同じ位置/色/ texCoordを共有するので、立方体の1つの面を4つの角の頂点で表すことができます。

しかし、異なる顔の三角形は、と同じの位置/色/ texCoordトリプレットを使用する場合にのみ頂点データを共有できます。ほとんどの場合、あなたはそうしません。

したがって、位置と色を大まかに再現する必要があります。キューブの各面は、個の別々のの位置と色を持ちます(ただし、他のものと同じ値を使用することがあります)。

また、テクスチャ座標を完全に避けることを検討してください。あなたは明らかにシェーダを使用しているので、あなたの環境をキューブマップに入れてください。キューマップから外側を指している8つのコーナーに "法線"を渡すことができます。それらを標準として補間し、それらを使ってキューブマップテクスチャにアクセスします。

+0

大丈夫です。ありがとうございました。それがうまくいくのですか?キューブマップを使用するように変換するにはどうしたらいいですか?はい、私はシェーダを使用しています。私はdrawAttribuesをコメントアウトしてdrawElementsを使用しなければなりませんでした。私は私の質問が今私は何をすべきかと思いますか? – Katianie

+0

drawAttributesに戻り、テストのために今は8つのtex座標を使用するだけで、キューブを適切に描画することができます。立方体の一部がカリングされますが、それはおそらくインデックスのためです – Katianie

関連する問題