Kết cấu Skybox tạo tác trên cạnh


12

Tôi gặp vấn đề lạ với việc vẽ kết cấu skybox trên Mac. Trên iPhone mọi thứ đều ổn. Tôi đã cố gắng thay đổi giá trị máy bay gần và xa mà không thành công.

Nó là một skybox gồm sáu kết cấu, và với mỗi kết cấu tôi đặt này:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Điều gì có thể là vấn đề?

Ảnh chụp màn hình:

Hình ảnh của bầu trời với các cạnh của skybox có thể nhìn thấy

BIÊN TẬP:

Tôi đã cố gắng đặt màu nền thành màu đỏ, để đảm bảo nếu nó bị chảy qua kết cấu

Tôi cũng đã cố gắng thay đổi coords của kết cấu này:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

Và hộp được vẽ theo thứ tự này:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

GIẢI PHÁP:

Giải pháp là đặt GL_CLAMP_TO_EDGE cho chính sơ đồ khối!

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

Câu trả lời:


8

Bạn có tích cực rằng bạn đã đặt GL_CLAMP_TO_EDGE cho từng kết cấu riêng lẻ không? Đây là một phần của trạng thái kết cấu riêng lẻ và nó mặc định là GL_REPEAT, vì vậy điều này cần được thực hiện sau khi liên kết với glBindTexture. Tôi nhận ra trong bài viết gốc, bạn thực sự nói rằng bạn đặt nó cho từng kết cấu, nhưng tôi tự hỏi mã thực sự trông như thế nào?

Ví dụ:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Điều này không giống như:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Tôi đã tìm thấy lỗi! Không nhất thiết phải đặt GL_CLAMP_TO_EDGE cho mọi kết cấu của bản đồ khối mà cho chính hình khối! 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);
martin hành hương

1

chèn '0,5f / texture_ thong' từ bên trái và bên phải của kết cấu và '0,5f / texture_height' từ trên xuống dưới. Bạn đang nhìn thấy các vật phẩm lấy mẫu - người lấy mẫu kết cấu thường lấy mẫu từ trung tâm của texels ở bên trái và bên phải, trên và dưới (ở 0 và 1 uv) bạn sẽ nhận được 50% bất cứ thứ gì mà bộ lấy mẫu của bạn nhận được khi vượt ra khỏi giới hạn . Đó là mặt khác của kết cấu hoặc màu lấy mẫu mặc định.


Đó là lý do tại sao anh ta đã có được GL_CLAMP_TO_EDGEbộ, nó sẽ làm cho các mẫu ngoài giới hạn lấy giá trị của các pixel trong kết cấu gần nhất. Những gì bạn mô tả có thể hoạt động rất tốt, nhưng nó không giải thích được tại sao vấn đề lại xảy ra ngay từ đầu.
aaaaaaaaaaaa

Tôi đã thử nó mà không thay đổi: /
martin pilch

0

Dự đoán tốt nhất của tôi là sự khác biệt giữa MAC và iPhone là do khử răng cưa trên MAC. Lập trình 3D của tôi là một chút gỉ, nhưng tôi đoán bạn sẽ phải làm cho tất cả các hình vuông là một phần của cùng một lưới hoặc một cái gì đó tương tự.

Giải pháp hack bẩn sẽ là làm cho tất cả các hình vuông hơi lớn để chúng chồng lên nhau và kẹp lẫn nhau và điều chỉnh tọa độ UV cho phù hợp.


Tôi đã cố gắng tắt khử răng cưa (bởi glDisable (GL_POLYGON_SMOOTH);) không có hiệu lực. Tôi đang vẽ skybox dưới dạng dải tam giác với các dạng coords -1 đến 1
martin pilch

1
Đó là âm thanh tốt với tôi. Ít nhất là bây giờ tôi không đoán được, nhưng bạn có thể muốn thu hẹp vấn đề bằng cách tìm hiểu xem màu đen đó có phải là nền chảy qua hay cạnh kết cấu hiển thị màu đen hay không. Nếu bạn đặt một đa giác màu đỏ ở đâu đó đằng sau vật phẩm, liệu vật phẩm đó có lấy màu của nó không?
aaaaaaaaaaaa

Tôi muốn thử mở rộng các bức tường, để chúng chồng lên nhau (giống như eBusiness đã viết) - Tôi nghĩ 0,0001 là đủ. Bạn không phải thay đổi tọa độ UV.
zacharmarz

1/10000 chắc chắn là không đủ, cường độ của vấn đề dường như nằm trong phạm vi 1/4 đến 1/2 pixel, do đó tùy thuộc vào kích thước kết cấu, cường độ tối thiểu để điều này hoạt động sẽ vào khoảng 1/1000. Không điều chỉnh tọa độ UV là hơi cẩu thả, do tính chất của kết cấu, bước nhảy thị giác có thể không được chú ý, nhưng nó vẫn sẽ sai. Trong mọi trường hợp, lời khuyên thêm cho các vụ hack nên phụ thuộc vào câu trả lời cho câu hỏi tôi đã hỏi trong bình luận trước đây.
aaaaaaaaaaaa

Các tạo tác không phải là một nền chảy máu thông qua các kết cấu. Tôi đã đặt màu nền thành màu đỏ mà không thay đổi. Tôi cũng đã cố gắng mở rộng tọa độ kết cấu
martin pilch

0

Đây là vấn đề thường gặp với hình khối trên CTNH cũ (hoặc có thể là điện thoại thông minh). Kiểm tra

GL_ARB_seamless_cube_map

mở rộng nếu nó có sẵn trên hw của bạn. Nếu vậy. Vấn đề sẽ được giải quyết bằng cách sử dụng nó.


Vấn đề là trên GeForce 9400M, không phải iPhone. Phần mở rộng này không có sẵn cho tôi.
martin hành hương

Đây chắc chắn KHÔNG phải là vấn đề gây ra bởi hình khối, bất kể có liền mạch hay không. Đây là một vấn đề gói kết cấu.
Tara

0

Là sáu kết cấu được thiết lập, cụ thể, như một bản đồ khối hoặc là mỗi khuôn mặt của skybox được hiển thị riêng với kết cấu riêng của chúng? Tôi nghe nói một số hệ thống PC đời đầu có bộ lọc khá kém khi xử lý các hình khối ở chỗ chúng không nhất thiết phải lọc từ kết cấu một mặt sang mặt tiếp theo khi bạn lấy mẫu gần các cạnh hình khối. AFAIK SGX (GPU iphone) nên lọc chính xác các cạnh.

Nó đã xảy ra với tôi rằng phần dưới của kết cấu bên của bạn trông giống như một màu xanh lam tương tự như vật phẩm. Bạn có thể thử, làm cho hàng dưới cùng (hoặc một vài hàng) pixel trở thành một màu đỏ tươi đáng ghét và xem điều đó có làm thay đổi màu vật phẩm không? Điều đó có thể cho một số ý tưởng thêm về những gì có thể hoặc không thể xảy ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.