みなさん、こんにちは、次は、OpenGL ES 3スカイボックスキューブマップをご紹介します。
自然やキューブマップテクスチャマッピング上のOpenGL ES、3Dテクスチャマッピング。そのテクスチャマップテクスチャので、キューブ・マップは、6つの個別の2Dテクスチャで構成されているキューブと呼ばれる、各テクスチャは、図中のキューブの2次元面です。
スカイボックスを考えることは、具体的シーンが大きなキューブに配置される以下に示すように、立方体集合組織の各面は、正方形である、非常に単純な技術です。
空のシーン効果的なリアルタイムの背景の空の内側にカートリッジを観察するために、空は各テクスチャマップの正方形のテクスチャマップの広場上空からなるカセット6を必要とします。図に示すように、このテクスチャ図6は、シームレスです。
テクスチャ座標のように3次元ベクトル(S、T、R)によってサンプリング図立方体テクスチャのみ方向ベクトルとして使用される3Dベクトル、のOpenGL ESは、テクセルキューブを得るサンプリング結果として、方向ベクトルマッピング表面に触れます。サンプリング点としてテクスチャの位置に対応するキューブ面チャートをタッチする方向ベクトルは、中心が図中のキューブの起源であることが必要。
図キューブと各平面指定方法は、実質的に同じ2Dテクスチャであり、各顔が(同じ幅及び高さを有する)の正方形でなければなりません。
2Dは、第一のテクスチャを生成する、一貫したテクスチャ用いて図立方体テクスチャは、テクスチャユニットは、適切に活性化し、その後に結合したテクスチャの種類。 GL_TEXTURE_CUBE_MAP
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
図の立方体。6備えるテクスチャので、それぞれのテクスチャーが直面しなければならない、呼び出す必要がglTexImage2D
機能6、のOpenGL ESは、標的立方体の面とテクスチャの図6に対応する6つの異なる立方体集合組織のターゲットビューを提供6 ORDER BY 1。
右のテクスチャに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前のテクスチャ
テクスチャ画像をロード6
int[] textureIdA=new int[6];//存放天空盒6面的纹理id的数组
//加载纹理
textureIdA[0]=initTexture(R.raw.skycubemap_back);
textureIdA[1]=initTexture(R.raw.skycubemap_left);
textureIdA[2]=initTexture(R.raw.skycubemap_right);
textureIdA[3]=initTexture(R.raw.skycubemap_down);
textureIdA[4]=initTexture(R.raw.skycubemap_up);
textureIdA[5]=initTexture(R.raw.skycubemap_front);
図の立方体の面6は、画像データに対応する前記テクスチャにロードされたmBoxImg
画像データの配列:
glGenTextures(1, &m_TextureId);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_TextureId);
for (int i = 0; i < 6; ++i)
{
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
GL_RGBA, mBoxImg[i].width, mBoxImg[i].height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, mBoxImg[i].ppPlane[0] );
}
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);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
通常と同様の2Dテクスチャ、キューブマップテクスチャを使用してオブジェクトを描画する前に、テクスチャは、対応するユニットを活性化するために必要とキューブ図に結合されます。違いは、フラグメントシェーダに対応する、サンプラになる、ということであり samplerCube
、三次元方向ベクトルにテクスチャ座標。
#version 300 es
precision mediump float;
in vec3 v_texCoord;
layout(location = 0) out vec4 outColor;
uniform samplerCube s_SkyBox;
void main()
{
outColor = texture(s_SkyBox, v_texCoord);
}
スカイボックスの描画:
glUseProgram(m_ProgramObj);
glBindVertexArray(m_SkyBoxVaoId);
glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_TextureId);
glUniform1i(m_SamplerLoc, 0);
glDrawArrays(GL_TRIANGLES, 0, 36);