Saya telah mengalami banyak kesulitan untuk mencoba fungsi campuran OpenGL agar berfungsi seperti yang saya harapkan dengan apa yang saya harapkan (atau dari program pengeditan gambar yang masuk akal). Sebagai contoh, saya akan menggunakan dua gambar ini untuk berbaur (agak sulit dilihat pada latar belakang putih sehingga warna diberi label):
Gambar yang akan dicampur
Inilah yang saya harapkan terjadi (dan apa yang terjadi di paint.net):
Hasil yang diharapkan
Jelas fungsi campuran default opengl membuatnya terlihat seperti ini (sangat salah):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Setelah banyak pengujian, ini adalah yang terdekat yang bisa saya dapatkan untuk membuat fungsi campuran "baik":
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Melihat kembali pada hasil yang diharapkan, Anda akan melihat bahwa beberapa warna sedikit lebih redup daripada seharusnya (bagian kiri tengah). Secara khusus, mereka ditakdirkan untuk setengah nilai warna mereka (karena alpha .5), dan saya tidak bisa membuat fungsi yang tidak melakukan ini (tanpa menyebabkan masalah pencampuran aneh dengan bagian transparan merah yang nyaris tidak terlihat).
Adakah yang tahu solusi untuk masalah ini? Salah satu yang saya miliki adalah menggunakan alpha yang di-pre-multiplikasi di sumber (sementara saya tidak ingin melakukan ini karena membutuhkan kerja ekstra untuk mengubah setiap warna yang saya gunakan dalam game saya untuk di-pre-multiplikasi atau hanya menulis beberapa hal di setiap shader) dan melakukannya seperti itu :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (Tanpa premultiplikasi)
Jelas itu salah juga, tetapi ini sebenarnya satu-satunya hasil yang benar yang saya dapatkan sejauh ini:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (input yang diultipultasikan)
Satu-satunya masalah adalah, bagaimana saya menyingkirkan premultiplikasi untuk menampilkannya di layar? Mungkin akan membutuhkan siklus render tambahan untuk setiap hal yang saya gabungkan dan itu tampaknya terlalu rumit untuk masalah ini, jadi saya masih mencari jawaban (yang menarik sehingga saya tidak dapat menemukan apa pun tentang ini, karena OpenGL sangat banyak digunakan sehingga Saya akan membayangkan orang lain mengalami masalah ini).
Sumber:
Pengujian fungsi campuran online - http://www.andersriggelsen.dk/glblendfunc.php
Gambar Lapisan Bawah - http://i.stack.imgur.com/XjLNW.png
Gambar Lapisan Atas - http: //i.stack.imgur .com / 9CN6w.png