Tôi đã gặp rất nhiều khó khăn khi cố gắng để chức năng pha trộn OpenGL hoạt động như tôi mong đợi nó giống như những gì tôi mong đợi (hoặc từ bất kỳ chương trình chỉnh sửa hình ảnh hợp lý nào). Ví dụ: tôi sẽ sử dụng hai hình ảnh này để trộn (hơi khó nhìn trên nền trắng để màu được dán nhãn):
Hình ảnh được pha trộn
Đây là những gì tôi mong đợi sẽ xảy ra (và những gì xảy ra trong paint.net):
Kết quả mong đợi
Rõ ràng chức năng pha trộn mặc định của opengl làm cho nó trông như thế này (rất sai):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Sau một tấn thử nghiệm, đây là lần gần nhất tôi có thể tạo ra một hàm pha trộn "tốt":
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Tuy nhiên, khi nhìn lại kết quả dự kiến ban đầu, bạn sẽ nhận thấy rằng một số màu hơi mờ hơn một chút (phần giữa bên trái). Cụ thể, chúng được xử lý trước một nửa giá trị màu của chúng (vì 0,5 alpha) và dường như tôi không thể tạo ra một chức năng không làm điều này (mà không gây ra sự cố pha trộn kỳ lạ với phần trong suốt màu đỏ hầu như không nhìn thấy).
Có ai biết một giải pháp cho vấn đề này? Một trong những điều mà tôi đã có là sử dụng alpha tiền mã hóa trong các nguồn (trong khi tôi không muốn làm điều này vì nó đòi hỏi thêm công việc để chuyển đổi mọi màu sắc tôi sử dụng trong trò chơi của mình sang chế độ trước hoặc chỉ viết một số nội dung trong mỗi shader) và làm như vậy :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (Không có tiền xử lý)
Rõ ràng điều đó cũng sai, nhưng đây thực sự là kết quả chính xác duy nhất tôi đã nhận được cho đến nay:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (đầu vào được xử lý trước)
Vấn đề duy nhất là, làm thế nào tôi có thể thoát khỏi sự xuất hiện sớm để hiển thị nó trên màn hình? Có lẽ nó sẽ yêu cầu một chu kỳ kết xuất bổ sung cho từng thứ tôi pha trộn và điều đó dường như quá phức tạp cho vấn đề này, vì vậy tôi vẫn đang tìm kiếm một câu trả lời (thật thú vị khi tôi không thể tìm thấy bất cứ điều gì về điều này, vì OpenGL được sử dụng rộng rãi đến mức Tôi muốn hình ảnh người khác gặp phải vấn đề này).
Nguồn:
Kiểm tra chức năng pha trộn trực tuyến - http://www.andersriggelsen.dk/glblendfunc.php
Hình ảnh lớp dưới cùng - http://i.stack.imgur.com/XjLNW.png
Hình ảnh lớp trên cùng - http: //i.stack.imgur .com / 9CN6w.png