2013-07-27 59 views
6

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ờ):

enter image description here

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).

enter image description here

[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.

+0

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ã? –

+0

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

Trả lời

5

Bản đồ khối kết cấu được ánh xạ bằng tọa độ kết cấu 3D: được sử dụng để xác định khối khuôn mặt nào thực sự được chọn và sau đó lấy tọa độ kết cấu 2D thực tế được sử dụng để truy cập vào textel mặt khối bản đồ.

tọa độ kết cấu của bạn là 2D (sai), và thực sự là tọa độ kết cấu vertexUV (và do đó vCoords) Z tọa độ luôn là 0, ánh xạ không dứt khoát kết cấu (thiếu thành phần được sao chép bằng giá trị thuộc tính mặc định, vec4 (0,0,0,1)).

Để có được kết quả mong muốn, hãy sửa đổi vertex shader để sử dụng một meaninful phối hợp:

vCoords = normalize(vVertexPos); 
+0

Đó là sự thật, tôi đang sử dụng UV lúc bắt đầu và tôi đang chuyển đổi nó thành UV. Ok tôi đoán rằng tôi phải sử dụng UV từ việc bắt đầu. Vì vậy, từ nơi tôi đang tham gia điều phối thứ 3 để bảng UV? – CppMonster

+1

Xem mã bên trên, đưa ra một giải pháp: từ vị trí đỉnh (được chuẩn hóa chính xác). Khối lập phương phải có barycenter tại (0,0,0). Trong điều kiện này, bạn có thể tính toán trực tiếp trong trình đổ bóng đỉnh. – Luca

+0

Tôi hiểu rằng bạn có nghĩa là một số quy tắc tôi phải tuân theo (không phải dòng mã này). Khi tôi viết dòng này để đổ bóng, tôi ngắt kết nối với dòng tọa độ kết cấu (vì vậy về cơ bản tôi không cần VBO UV). Tôi đã cố gắng để thay đổi dòng này, kết quả là một quad với kết cấu (tôi sử dụng khối lập phương barycentered với các đỉnh harcoded trình bày ở trên). – CppMonster

Các vấn đề liên quan