Tôi cố gắng lập bản đồ khối lập phương với 6 bitmap để đạt được hiệu ứng hộp đêm. Vấn đề của tôi là một kết cấu được ánh xạ tới mọi mặt của khối lập phương. Tôi đã kiểm tra trong gDEBugger, trong bộ nhớ kết cấu khối lập phương tôi chỉ có một hình ảnh (khi tôi cố gắng tải sáu hình ảnh).Lập bản đồ khối lập phương trong OpenGL
Mã kết cấu chuẩn bị:
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 file:
# 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
Câu hỏi của tôi:
- Are kỹ thuật tôi sử dụng trong mã này trông ok?
- Cách kết cấu lập bản đồ cho khối lập phương (trong kết cấu GL_TEXTURE_CUBE_MAP), khi chỉ có 2 tia cực tím? (Tôi có nghĩa là nói chung.)
- Tôi có thể sử dụng tự động tạo UV trong tình huống này không (tôi có để thực hiện nhiều thay đổi đối với trình đổ bóng) không?
- Ai có thể đề xuất tôi có thể tìm kiếm sự cố ở đâu? (với một số xác suất; bộ đệm, bóng đổ, mắt lưới; chỉ đề xuất)?
[Chỉnh sửa]: Tôi đã cố gắng mã hóa đỉnh và uv trong tệp nguồn riêng và tôi có cùng một vấn đề - một kết cấu cho tất cả các khuôn mặt khối lập phương. dữ liệu mã hóa cứng có vẻ là đúng:
#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;
}
Tuy nhiên hai câu hỏi suplementary, tôi có gọi OpenGL:
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
- Tôi hiểu rằng OpenGL xử lý r phối hợp tự động, vì có thông tin trong hằng số GL_TEXTURE_CUBE_MAP_POSITIVE_X cho glTexImage2D()?
- Có cần sửa đổi bất kỳ điều chỉnh nào của r phối hợp trong Vertex Shader không?
Có màn hình kết quả dưới đây (viết tàn tật để depth buffer và không đặt scalling, nhưng nó không phải là vấn đề của tôi bây giờ):
tôi đã nhận thấy rằng đôi kết cấu được tải thứ năm kết cấu (GL_TEXTURE_CUBE_MAP_POSITIVE_Z).
[EDIT LAST]: Có vấn đề với UV tọa độ trong Skybox VS (r phối hợp có một giá trị), Skybox VS nên được, như sau:
void main()
{
vCoords = normalize(vVertexPos);
gl_Position = MVP * vec4(vVertexPos,1.0);
}
Có một số vấn đề với kỹ thuật Skybox, nhưng chúng không phải là chủ đề của chủ đề này. Giải quyết.
gì xảy ra nếu bạn không sử dụng obj mô hình và thay vào đó tạo 6 quads trong mã? –
Tôi đã cố định các đỉnh và các tia cực tím trong tiêu đề riêng biệt và có cùng một vấn đề. – CppMonster