あなたが探しているものはcube mapです。 OpenGLでは、一度に6つのテクスチャ(キューブのサイズ面を表す)を定義し、一般的な2Dテクスチャ座標の代わりに3Dテクスチャ座標を使用してマップすることができます。単純なキューブの場合、テクスチャの座標は頂点のそれぞれの法線と同じになります。 (この方法でプレーンキューブをテクスチャ化するだけなら、ノーマルとテクスチャ座標を頂点シェーダに統合することもできます)キューブマップは、現在行っているように6つの異なるテクスチャを同時にバインドしようとするよりはるかに簡単です。あなたのシェーダを行う際
GLuint mHandle;
glGenTextures(1, &mHandle); // create your texture normally
// Note the target being used instead of GL_TEXTURE_2D!
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_CUBE_MAP, mHandle);
// Now, load in your six distinct images. They need to be the same dimensions!
// Notice the targets being specified: the six sides of the cube map.
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data1);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data2);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data3);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data4);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data5);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data6);
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// And of course, after you are all done using the textures...
glDeleteTextures(1, &mHandle);
は今、あなたが受け入れるおよび/または3D座標(vec3)の代わりに、2次元座標(VEC2)を渡すために頂点シェーダが必要です。この例では
// old GLSL style
attribute vec3 inTextureCoordinate;
varying vec3 vTextureCoordinate;
// more recent GLSL
in vec3 inTextureCoordinate;
out vec3 vTextureCoordinate;
、あなたの頂点シェーダは、単にvTextureCoordinate = inTextureCoordinateを割り当てます。フラグメントシェーダはそのテクスチャ座標を受け取り、キューブマップの一様性をサンプリングする必要があります。
uniform samplerCube cubeMap;
...
gl_FragColor = textureCube(cubeMap, vTextureCoordinate);
Whew!それはたくさんあった。私は何かを残しましたか?
私はもっと知りたいです。 – Mark
OK、あなたの他の質問に更新を掲載しています...私もここに投稿します。 – TheBuzzSaw
お返事ありがとうございます。今はもうちょっと意味が分かります。しかし、単純化のためにキューブの例を使用していましたが、実際にロードしようとしているモデルには30以上のテクスチャがあります。より多くのテクスチャを可能にするために、ソリューションの拡張を提案することはできますか? –