-4

私は現在 glsl を使用してスカイボックスを描画していますが、私のプログラムの最終結果は私の期待ではありません。画像エディターで 6 つの画像 (right.bmp、left.bmp、top.bmp など) を垂直および垂直に手動で作成すると、スカイボックスは正常に動作します。プログラム内の問題をすばやく見つけるために、プログラムを単純化して、片面、前面のみを描画します。

私のプログラムのスクリーンショット:

画像リンク: http://i1345.photobucket.com/albums/p668/nimaccc/front_zps741fc377.jpg

元の素材:

画像リンク: http://i1345.photobucket.com/albums/p668/nimaccc/original_zps3dbccf2e.jpg

関連するコードは次のとおりです。

頂点シェーダー:

attribute  vec3 VertexPosition;
varying vec3 ReflectDir;

void main()
{
   ReflectDir = VertexPosition;

   gl_Position = gl_ModelViewProjectionMatrix * vec4(VertexPosition,1.0);
}

フラグメント シェーダー:

 varying vec3 ReflectDir;
 uniform samplerCube CubeMapTex; 

 void main() {
    vec4 cubeMapColor = texture(CubeMapTex,ReflectDir );

    gl_FragColor=  cubeMapColor;
 }

私のopenglプログラム内のいくつかのコード:

これは、キューブ マップをシェーダーにバインドするために使用されます。

 glActiveTexture(GL_TEXTURE5);

    GLuint texID;
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_CUBE_MAP, texID);

    GLuint targets[] = {
        GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
    };

    const char* baseFileName[] = {
    "Right",
    "Left",
    "Top",
    "Bottom",
    "Front",
    "Back"


    };

    for( int i = 0; i < 6; i++ ) {
        string texName = string(baseFileName[i])+".bmp";

            IMAGE img;
            img.Load((char*)texName.c_str());
            img.ExpandPalette();

            glTexImage2D(targets[i], 0, GL_RGBA, img.width, img.height, 0,
                 img.format, GL_UNSIGNED_BYTE, img.data);

    }

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

    m_shader->compileandlink();
    m_shader->useprogram();
    m_shader->setUniform("CubeMapTex", 5);
    m_shader->unuseprogram();

そして、これが私の表側の頂点で、時計回りに巻かれています。

    float extend2 = extend*.5f;
    m_cube_v = new vertex_t[24];

    //front
    m_cube_v[0].pos[0] = -extend2;
    m_cube_v[0].pos[1] = -extend2;
    m_cube_v[0].pos[2] = extend2;

    m_cube_v[1].pos[0] = extend2;
    m_cube_v[1].pos[1] = -extend2;
    m_cube_v[1].pos[2] = extend2;

    m_cube_v[2].pos[0] =  extend2;
    m_cube_v[2].pos[1] =  extend2;
    m_cube_v[2].pos[2] = extend2;

    m_cube_v[3].pos[0] = -extend2;
    m_cube_v[3].pos[1] = extend2;
    m_cube_v[3].pos[2] = extend2;

何が悪かったのか?

4

1 に答える 1

2

OpenGL テクスチャ座標系の原点は画像の左下隅にあるため、スカイボックスが上下逆さまにレンダリングされます。適切な結果を得るには、テクスチャを変換するか、テクスチャ座標をミラーリングする必要があります。

于 2013-05-07T06:43:17.923 に答える