三角形を使ったOpenGLのSkybox

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

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(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();
}
0
緑色のチェックマークが見えず、誰もこの質問にまだ答えなかった。人々はチェックボックスをクリックするように私に指示し続けますが、誰もそれがどこにあるかを教えてくれません。レンダリングコードを最後に追加しました。
追加された 著者 Katianie,
あなたは答えを受け入れる方法を調べたいかもしれません。あなたの質問に対する回答の横に緑のチェックマークが付きます。あなたはあなたの質問に対する正解であると感じる答えに対してそれを選択します。あなたはこれまでに質問したことのいずれかのためにこれをしていないので、それらのいくつかを取り上げて適切な回答を受け入れることができます。
追加された 著者 Nicol Bolas,
レンダリングコードはどこですか? VBOに属性をどのようにバインドしますか?頂点データが正しい(私はチェックしなかった)正しい巻線順序であると仮定すると、そのような限られたコードから何が間違っているのかを知ることはかなり困難です。私は "bindAttrib"が何をするのか分かりませんが、VBOがバインドされていないときに頂点属性(つまりglVertexAttribPointerを呼び出します)を設定していれば動作しません!
追加された 著者 Nicolas Lefebvre,

1 答え

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

あなたは4色、8ポジション、24テクスチャ座標を持っています。 OpenGLはそれをどうしたらいいのか分からない。

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

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

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

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

したがって、あなたのポジションと色を再現する必要があります。キューブの各面は、(たとえ他のものと同じ値を使用しても)別々の位置と色を持ちます。

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

1
追加された
それは大変感謝しています。だから、もし私がそれが働くだろうtextuure座標を取り除くことだった?キューブマップを使用するように変換するにはどうすればよいですか?はい、私はシェーダを使用しています。私はdrawAttribuesをコメントアウトしてdrawElementsを使用しなければなりませんでした。私の質問は今私が何をすべきかということですね?
追加された 著者 Katianie,
drawAttributesに戻り、テストのために今は8tex座標を使用するだけでキューブを適切に描画します。立方体の一部がカリングされますが、それはおそらくインデックスのためです
追加された 著者 Katianie,