Làm thế nào để kết xuất một phần trong suốt?


13

Chào buổi sáng StackOverflow, hiện tại tôi đang gặp một chút vấn đề vì dường như tôi không thể tìm ra cách nào để hiển thị một phần của kết cấu trong suốt với openGL.

Đây là cài đặt của tôi: Tôi có một hình tứ giác, đại diện cho một bức tường, được phủ bằng kết cấu này (được chuyển đổi thành PNG cho mục đích tải lên). Rõ ràng, tôi muốn bức tường mờ đục, ngoại trừ các tấm kính. Có một mặt phẳng khác đằng sau bức tường được cho là hiển thị một cảnh quan. Tôi muốn nhìn phong cảnh từ phía sau cửa sổ. Mỗi kết cấu là một TGA với kênh alpha.

"Phong cảnh" được hiển thị đầu tiên, sau đó là bức tường. Tôi nghĩ rằng nó sẽ đủ để đạt được hiệu ứng này nhưng dường như không phải vậy. Phần cửa sổ được cho là trong suốt có màu đen và phong cảnh chỉ xuất hiện khi tôi di chuyển qua tường.

Tôi đã cố gắng nghịch ngợm với GLBlendFunc () sau khi đã kích hoạt nó nhưng dường như nó không thực hiện được mẹo.

Có phải tôi đang quên một bước quan trọng?

Cảm ơn bạn :)


Xin chào, chào mừng đến với gdse. Tôi đã chỉnh sửa rất ít, chúng tôi không thích đặt thẻ vào các câu hỏi nhiều. (Đặc biệt là khi bạn sử dụng cùng một thẻ trong thẻ :)). Và cho câu hỏi của bạn. Bạn đang sử dụng đường ống cố định hoặc shader của riêng bạn?
Notabene

Cảm ơn bạn đã chỉnh sửa. Tôi không chắc về ý nghĩa của "đường ống cố định" nhưng tôi xây dựng mọi đỉnh bằng tay và tôi không sử dụng bất kỳ trình đổ bóng nào. Nếu đó là vấn đề, tôi không sử dụng phiên bản openGL cuối cùng vì nó là bài tập cho trường học (tôi nghĩ đó là openGL 3).
megamoustache

Sẽ thật tuyệt nếu bạn có thể đưa hình ảnh vào câu hỏi của mình. Nó dường như đã biến mất khỏi vị trí ban đầu của nó.
HOẶC Mapper

Câu trả lời:


19

Ngoài mọi thứ bạn đã nêu (kết cấu với các kênh alpha, vẽ phong cảnh trước khi vẽ tường + cửa sổ), bạn cũng cần thực hiện thêm hai việc nữa.

Trước tiên, bạn cần kích hoạt chức năng hòa trộn của OpenGL:

glEnable(GL_BLEND);

Thứ hai, bạn cần cho OpenGL biết cách tính màu của các pixel được pha trộn (mà OpenGL gọi là "các mảnh", tình cờ). Trong trường hợp này, bạn sẽ ổn với một cái gì đó đơn giản như thế này:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Sau khi trộn được bật, OpenGL sẽ kết hợp màu pixel theo các tham số chức năng bạn cung cấp cho nó trong glBlendFunc. Cụ thể, nó sẽ thực hiện "source.color * source.alpha + Destination.color * (1-source.alpha)", trong đó "source" là kết cấu bạn hiện đang hiển thị và "Destination" là màu đã có trong framebuffer (phong cảnh). Vì vậy, bất cứ nơi nào kênh alpha của bạn có màu trắng, bạn sẽ có được màu tường và bất cứ nơi nào kênh alpha có màu đen, bạn sẽ có được màu phong cảnh. Nếu kênh alpha có màu xám, thì bạn sẽ có một số mờ dần giữa hai màu.

Nếu cửa sổ của bạn hoàn toàn trong suốt thì có nhiều cách khác để làm điều này, trong đó thứ tự bạn vẽ hai đa giác không quan trọng, nhưng điều đó bắt đầu đi vào các khái niệm nâng cao hơn như ngưỡng alpha. Có lẽ không cần thiết cho tình hình hiện tại của bạn.

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.