スカイボックス効果を実現するために、6つのビットマップでキューブをマップしようとしました。私の問題は、1つのテクスチャがキューブのすべての面にマッピングされているという事実です。私はgDEBuggerをチェックしました。キューブテクスチャのメモリには、画像が1つしかありません(6つの画像をロードしようとしています)。イメージがあります。OpenGLでのキューブマッピング
テクスチャを準備コード:
bool Texture::LoadCubicTexture(vector<string> filenameTable)
{
glGenTextures(1,&texID);
glBindTexture(GL_TEXTURE_CUBE_MAP,texID);
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);
int i = 0;
vector<string>::iterator vsit;
// There is always six filenames
for(vsit=filenameTable.begin();vsit!=filenameTable.end();++vsit)
{
string filename = *vsit;
BMPData* bmpData = LoadTextureBMPData_custom(filename);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+i,0,GL_RGB,bmpData->width,bmpData->height,0,GL_BGR,GL_UNSIGNED_BYTE,&(bmpData->data[0]));
i++;
delete daneObrazu;
}
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
return true;
}
VS:
#version 330 core
in vec3 vVertexPos;
in vec3 vertexUV;
out vec3 vCoords;
uniform mat4 MVP;
void main()
{
vCoords = normalize(vertexUV);
gl_Position = MVP * vec4(vVertexPos,1.0);
}
FS:
#version 330 core
in vec3 vCoords;
uniform samplerCube cube;
out vec4 vFragColor;
void main()
{
vFragColor = texture(cube, vCoords);
}
OBJファイル:
# Blender v2.62 (sub 0) OBJ File: 'skybox.blend'
# www.blender.org
mtllib skybox.mtl
o Cube
v 10.487665 -10.487666 -10.487665
v 10.487665 -10.487666 10.487665
v -10.487667 -10.487666 10.487664
v -10.487662 -10.487666 -10.487670
v 10.487671 10.487666 -10.487660
v 10.487659 10.487666 10.487673
v -10.487670 10.487666 10.487662
v -10.487665 10.487666 -10.487666
vt 0.990480 0.014286
vt 0.993478 0.991259
vt 0.016505 0.994256
vt 0.013507 0.017283
vt 0.988479 0.008111
vt 0.985457 0.993412
vt 0.000157 0.990390
vt 0.003179 0.005089
vt 0.002693 1.001082
vt -0.000347 0.009939
vt 0.990796 0.006898
vt 0.993837 0.998041
vt 0.004581 0.999210
vt 0.001535 0.006444
vt 0.994302 0.003398
vt 0.997347 0.996165
vt 0.004172 -0.000587
vt 0.996320 -0.003630
vt 0.999364 0.988517
vt 0.007216 0.991561
vt 0.000632 0.000140
vt 0.983846 -0.002921
vt 0.986862 0.995017
vt 0.003648 0.998078
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
usemtl Skybox
s off
f 1/1/1 2/2/1 3/3/1
f 1/1/1 3/3/1 4/4/1
f 5/5/2 8/6/2 7/7/2
f 5/5/2 7/7/2 6/8/2
f 1/9/3 5/10/3 6/11/3
f 1/9/3 6/11/3 2/12/3
f 2/13/4 6/14/4 7/15/4
f 2/13/4 7/15/4 3/16/4
f 3/17/5 7/18/5 8/19/5
f 3/17/5 8/19/5 4/20/5
f 5/21/6 1/22/6 4/23/6
f 5/21/6 4/23/6 8/24/6
件の
私の質問:
- は、私はOKに見えるこのコードで使用テクニックはありますか?
- キューブ(GL_TEXTURE_CUBE_MAPテクスチャ内)でテクスチャがどのようにマッピングされているか、 UVが2つしかない場合は?
- この状況では、自動UV生成を使用できますか(シェーダに多くの変更を加えるには を使用しますか)。
- 誰かが私に問題を検索できる場所を教えてもらえますか? (いくつかの 確率;バッファ、シェーダ、メッシュ、提案のみ)?
[編集]: 別のソースファイルで頂点とUVをハードコードしようとしましたが、キューブのすべての面に同じ問題があります。ハードコードされたデータが正しいように思わ:
#include "TestCube.h"
vector<vec3> GetTestCubeVertices()
{
vector<vec3> vrtx;
const float xd = 1.0f;
const float yd = 1.0f;
const float zd = 1.0f;
const float testCubeVertices[] =
{
-xd, -yd, zd, xd, -yd, zd, -xd, yd, zd, // ABE
xd, -yd, zd, -xd, yd, zd, xd, yd, zd, // BEF
xd, -yd, zd, xd, -yd, -zd, xd, yd, zd, // BCF
xd, -yd, -zd, xd, yd, zd, xd, yd, -zd, // CFG
xd, -yd, -zd, -xd, -yd, -zd, xd, yd, -zd, // CDG
-xd, -yd, -zd, xd, yd, -zd, -xd, yd, -zd, // DGH
-xd, -yd, -zd, -xd, -yd, zd, -xd, yd, -zd, // DAH
-xd, -yd, zd, -xd, yd, -zd, -xd, yd, zd, // AHE
-xd, yd, zd, xd, yd, zd, -xd, yd, -zd, // EFH
xd, yd, zd, -xd, yd, -zd, xd, yd, -zd, // FHG
xd, -yd, zd, -xd, -yd, zd, xd, -yd, -zd, // BAC
-xd, -yd, zd, xd, -yd, -zd, -xd, -yd, -zd, // ACD
};
for(int i=0;i<108;i=i+3)
vrtx.push_back(vec3(testCubeVertices[i],testCubeVertices[i+1],testCubeVertices[i+2]));
return vrtx;
}
vector<vec2> GetTestCubeUVs()
{
vector<vec2> uv;
const float testCubeUV[] =
{
0,0, 1,0, 0,1, // ABE
1,0, 0,1, 1,1, // BEF
0,0, 1,0, 0,1, // BCF
1,0, 0,1, 1,1, // CFG
0,0, 1,0, 0,1, // CDG
1,0, 0,1, 1,1, // DGH
0,0, 1,0, 0,1, // DAH
1,0, 0,1, 1,1, // AHE
0,0, 1,0, 0,1, // EFH
1,0, 0,1, 1,1, // FHG
0,0, 1,0, 0,1, // BAC
1,0, 0,1, 1,1, // ACD
};
for(int i=0;i<72;i=i+2)
uv.push_back(vec2(testCubeUV[i],testCubeUV[i+1]));
return uv;
}
それでも2つのsuplementaryの質問、私は、OpenGLの呼び出しがあります。
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
- を私はOpenGLがR は、情報を持っているので、自動的に座標を扱うことを理解 glTexImage2D()の定数GL_TEXTURE_CUBE_MAP_POSITIVE_X?
- 必要な変更はありますかr Vertex Shaderでの座標はありますか?
あり、以下の結果画面(無効書き込みがデプスバッファへとscallingを設定していないが、それは今私の問題ではありませんでした)です:
私は重複テクスチャが第五ロードされていることに気付きましたテクスチャ(GL_TEXTURE_CUBE_MAP_POSITIVE_Z)。
[LAST EDIT]: UVの問題は以下のように、(R座標の値を有する)、スカイボックスVSあるべきスカイボックスVS座標あった:
void main()
{
vCoords = normalize(vVertexPos);
gl_Position = MVP * vec4(vVertexPos,1.0);
}
がありますSkyboxテクニックに関するいくつかの問題がありましたが、このスレッドのトピックではありませんでした。解決済み。
あなたがモデルを.OBJ使用し、代わりにコードで6つのクワッドを作成しない場合はどうなりますか? –
私は別々のヘッダーに頂点とUVをハードコードしましたが、同じ問題があります。 – CppMonster