2013-05-05 74 views
-4

我目前使用glsl來繪製天空盒,但我的程序的最終結果並不是我的期望,天空盒的六面看起來像是所有面垂直翻轉,然後垂直翻轉。如果我在某些圖像編輯器中手動垂直和垂直創建六個圖像(right.bmp,left.bmp,top.bmp等),skybox可以正常工作。爲了快速找到我的程序中的問題,我簡化了我的程序,只繪製了一面,正面。爲什麼我用opengl glsl來實現天空盒,出錯了?

我的程序截圖:

圖像鏈接:http://i1345.photobucket.com/albums/p668/nimaccc/front_zps741fc377.jpg

原始資料:

圖像鏈接:http://i1345.photobucket.com/albums/p668/nimaccc/original_zps3dbccf2e.jpg

下面是相關代碼:

vertics着色器:

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; 

出了什麼問題?

+0

這可能是你只需要看看你如何畫你的立方體指數。 – rwols 2013-08-17 11:02:03

回答

2

OpenGL紋理座標系的原點位於圖像的左下角,這就是爲什麼您的天空盒呈現顛倒。您必須轉換紋理,或鏡像紋理座標以獲得正確的結果。

+0

謝謝你的回放,我不'認爲這是正確的答案。因爲不僅天空盒翻倒,而且從左到右顛倒。 – 2013-05-17 14:59:02