また、キューブマップとして知られているキューブマップ、。実際には、通常の状況下で六面を含むテクスチャマップは、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.0F、 1.0F、 - 1.0F 、 - 1.0F、 - 1.0F、 - 1.0F 、 1.0F、 - 1.0F、 - 1.0F 、 1.0F、 - 1.0F、 - 1.0F、 1.0F、 1.0F、 - 1.0F 、 - 1.0F、 1.0F、 - 1.0F 、 - 1.0F、 - 1.0F、 1.0F 、 - 1.0F、 - 1.0F、 - 1.0F 、 - 1.0F、 1.0 F、 - 1.0F 、 - 1.0F、 1.0F、 - 1.0F 、 - 1.0F、 1.0F、 1.0F 、 -1.0F、 - 1.0F、 1.0F 、 1.0F、 - 1.0F、 - 1.0F 、 1.0F、 - 1.0F、 1.0F 、 1.0F、 1.0F、 1.0F 、 1.0F、 1.0F、 1.0F 、 1.0 F、 1.0F、 - 1.0F 、 1.0F、 - 1.0F、 - 1.0F 、 - 1.0F、 - 1.0F、 1.0F 、 -1.0F、 1.0F、 1.0F 、 1.0F、 1.0F、 1.0F 、 1.0F、 1.0F、 1.0F 、 1.0F、 - 1.0F、 1.0F 、 - 1.0F、 - 1.0F、 1.0F 、 - 1.0 F、 1.0F、 - 1.0F 、 1.0F、 1.0F、 - 1.0F 、 1.0F、 1.0F、 1.0F、 1.0F、 1.0F、 1.0F 、 - 1.0F、 1.0F、 1.0F 、 - 1.0F、 1.0F、 - 1.0F 、 - 1.0F、 - 1.0F、 - 1.0F 、 - 1.0F、 - 1.0F、 1.0F 、 1.0F、 - 1.0F、 - 1.0F 、 1.0F、 - 1.0F、 - 1.0F 、 - 1.0F、 -1.0F、 1.0F 、 1.0F、 - 1.0F、 1.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(0、3、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(10、10、10 ))。 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、0、36 ); glBindVertexArray(0 ); }
テクスチャサンプリングフラグメントシェーダ
均一なsamplerCubeスカイボックス。
結果は:
1、反射 - ボックス
図2に示すように、反射 - nanosuit
3、屈折 - nanosuit