キューブマップ

 

  また、キューブマップとして知られているキューブマップ、。実際には、通常の状況下で六面を含むテクスチャマップは、6つのマップがキューブマップを構成してロードされます。

  次のようにコードをロードします。

ボイド WKS ::キューブマップ:: LoadCubeMap(スタンダード::ベクトル<スタンダード:: 文字列 > 面){ 
    glGenTextures(1、&この - > textureID)。
    glBindTexture(GL_TEXTURE_CUBE_MAP、この - > textureID); 

    int型の幅、高さ、nrChannels。
    (符号なし整数 i = 0 ; iは<faces.size(); iは++ ){ 
        符号なしのchar *画像= SOIL_load_image(顔[I] .c_str()、&幅、および高さ、&nrChannels、SOIL_LOAD_RGB)。
        もし(画像){ 
            glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + I、0、GL_RGB、幅、高さ、0 、GL_RGB、GL_UNSIGNED_BYTE、画像)。
        } 
        { 
            STD :: COUT << " キューブマップテクスチャパスに読み込みに失敗しました:" <<顔[I] << はstd :: ENDL。
        } 
        SOIL_free_image_data(画像)。
    } 
    glTexParameteri(GL_TEXTURE_CUBE_MAP、GL_TEXTURE_MIN_FILTER、GL_LINEAR)。
    glTexParameteri(GL_TEXTURE_CUBE_MAP、GL_TEXTURE_MAG_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)。
}

  スカイボックスを達成キューブマップ使用

#pragma
の#include " モデル/ Texture.h " 
の#include " は、shader.h " 
の#include " Camera.h " 

クラススカイボックス
{ 
パブリック
    スカイボックス()。
    スカイボックス();
     setTexture(のstd ::ベクトル<はstd :: 文字列 > );
    描画(); 

プライベート
    GLuint VAO、VBO。
    GLuint textureID; 
    シェーダ *のシェーダ。
    カメラ * PHC = カメラ::のgetInstance(); 

プライベート無効セットアップ(); 
}。

スカイボックス::スカイボックス()
{ 
    セットアップ()。
} 

スカイボックス::スカイボックス()
{ 
} 

ボイドスカイボックス::セットアップ(){
     フロート skyboxVertices [] = {
         // 位置           
        - 1.0F1.0F、 - 1.0F  - 1.0F、 - 1.0F、 - 1.0F 1.0F、 - 1.0F、 - 1.0F 1.0F、 - 1.0F、 - 1.0F1.0F1.0F、 - 1.0F  - 1.0F1.0F、 - 1.0F 

         - 1.0F、 - 1.0F1.0F  - 1.0F、 - 1.0F、 - 1.0F  - 1.0F1.0 F、 - 1.0F  - 1.0F1.0F、 - 1.0F  - 1.0F1.0F1.0F  -1.0F、 - 1.0F1.0F 

        1.0F、 - 1.0F、 - 1.0F 1.0F、 - 1.0F1.0F 1.0F1.0F1.0F 1.0F1.0F1.0F 1.0 F1.0F、 - 1.0F 1.0F、 - 1.0F、 - 1.0F 

         - 1.0F、 - 1.0F1.0F  -1.0F1.0F1.0F 1.0F1.0F1.0F 1.0F1.0F1.0F 1.0F、 - 1.0F1.0F  - 1.0F、 - 1.0F1.0F 

         - 1.0 F1.0F、 - 1.0F 1.0F1.0F、 - 1.0F 1.0F1.0F1.0F1.0F1.0F1.0F  - 1.0F1.0F1.0F  - 1.0F1.0F、 - 1.0F 

         - 1.0F、 - 1.0F、 - 1.0F  - 1.0F、 - 1.0F1.0F 1.0F、 - 1.0F、 - 1.0F 1.0F、 - 1.0F、 - 1.0F  - 1.0F、 -1.0F1.0F 1.0F、 - 1.0F1.0F 
    }。
    glGenVertexArrays(1、&VAO)。
    glGenBuffers(1、&VBO)。
    glBindVertexArray(VAO)。
    glBindBuffer(GL_ARRAY_BUFFER、VBO)。
    glBufferData(GL_ARRAY_BUFFER、はsizeof(skyboxVertices)、&skyboxVertices、GL_STATIC_DRAW)。
    glEnableVertexAttribArray(0 )。
    glVertexAttribPointer(03、GL_FLOAT、GL_FALSE、3 *のはsizeofフロート)、(ボイド *)0 )。
    glBindVertexArray(0 )。

    シェーダ = 新しいシェーダ(" ./Shader/skybox.vert "" ./Shader/skybox.frag " ); 
} 

ボイドスカイボックス:: setTexture(スタンダード::ベクトル<スタンダード:: 文字列 > 面){ 
    WKS ::キューブマップキューブマップ。
    cubeMap.LoadCubeMap(面)
    この - > textureID = cubeMap.GetTextureID()。
} 

ボイドスカイボックス::描画(){ 
    glDepthFunc(GL_LEQUAL)。

    この - > shader-> ()を使用します。
    GLM :: MAT4モデル= GLM ::スケール(GLM :: MAT4(1)、GLM :: vec3(101010 ))。
    GLM :: MAT4ビュー = GLM :: MAT4(GLM :: MAT3(phc-> getViewMatrix()))。
    この - > shader-> setMat4(" モデル" 、モデル)。
    この - > shader-> setMat4(" ビュー" 、ビュー)。
    この - > shader-> setMat4(" 投影"、phc-> getProjectionMatrix()); 

    glBindTexture(GL_TEXTURE_CUBE_MAP、この - > textureID); 
    glBindVertexArray(VAO)。 
    glDrawArrays(GL_TRIANGLES、036 ); 
    glBindVertexArray(0 ); 
}

  テクスチャサンプリングフラグメントシェーダ

均一なsamplerCubeスカイボックス。

  結果は:

  1、反射 - ボックス

  

  図2に示すように、反射 - nanosuit

  

  3、屈折 - nanosuit

  

 

おすすめ

転載: www.cnblogs.com/chen9510/p/11431564.html