Bagaimana membuat tekstur sebagian transparan?

13

Selamat Pagi StackOverflow, saya mengalami sedikit masalah sekarang karena saya tidak bisa menemukan cara untuk membuat bagian dari tekstur secara transparan dengan openGL.

Berikut adalah pengaturan saya: Saya memiliki quad, mewakili dinding, ditutupi dengan tekstur ini (dikonversi ke PNG untuk keperluan pengunggahan). Jelas, saya ingin dinding menjadi buram, kecuali untuk panel kaca. Ada pesawat lain di belakang dinding yang seharusnya menunjukkan pemandangan. Saya ingin melihat pemandangan dari balik jendela. Setiap tekstur adalah TGA dengan saluran alfa.

"Lansekap" dirender terlebih dahulu, lalu dinding. Saya pikir itu akan cukup untuk mencapai efek ini tetapi ternyata bukan itu masalahnya. Bagian jendela yang seharusnya transparan berwarna hitam dan pemandangan hanya muncul ketika saya melewati dinding.

Saya mencoba bermain-main dengan GLBlendFunc () setelah mengaktifkannya tetapi sepertinya tidak berhasil.

Apakah saya lupa langkah penting?

Terima kasih :)

megamoustache
sumber
Halo, selamat datang di gdse. Saya membuat sedikit pengeditan, kami tidak terlalu suka menempatkan tag ke heading pertanyaan. (Terutama ketika Anda menggunakan tag yang sama di tag :)). Dan untuk pertanyaan Anda. Apakah Anda menggunakan pipa tetap atau shader Anda sendiri?
Notabene
Terima kasih atas hasil editnya. Saya tidak yakin tentang arti "pipa tetap" tetapi saya membangun setiap titik secara manual dan saya tidak menggunakan shader apa pun. Jika itu penting, saya tidak menggunakan versi openGL terakhir karena ini untuk tugas sekolah (saya pikir itu openGL 3).
megamoustache
Akan lebih bagus jika Anda bisa memasukkan gambar ke dalam pertanyaan Anda. Tampaknya telah menghilang dari lokasi aslinya.
ATAU Mapper

Jawaban:

19

Selain semua yang Anda nyatakan (tekstur dengan saluran alfa, menggambar lansekap sebelum menggambar dinding + jendela), Anda juga perlu melakukan dua hal lagi.

Pertama, Anda harus mengaktifkan fungsi blending OpenGL:

glEnable(GL_BLEND);

Kedua, Anda perlu memberi tahu OpenGL bagaimana cara menghitung warna-warna piksel campuran (yang oleh OpenGL disebut "fragmen"). Dalam hal ini, Anda akan baik-baik saja dengan sesuatu yang sederhana seperti ini:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Setelah blending dihidupkan, OpenGL akan menggabungkan warna pixel sesuai dengan parameter fungsi yang Anda berikan di glBlendFunc. Secara khusus, ia akan melakukan "source.color * source.alpha + destination.color * (1-source.alpha)", di mana "sumber" adalah tekstur yang sedang Anda render, dan "tujuan" adalah warna yang sudah ada dalam framebuffer (lanskap). Jadi di mana pun saluran alfa Anda berwarna putih, Anda akan mendapatkan warna dinding, dan di mana pun saluran alfa berwarna hitam, Anda akan mendapatkan warna lanskap. Jika saluran alpha berwarna abu-abu, maka Anda akan mendapatkan beberapa fade silang di antara kedua warna.

Jika jendela Anda sepenuhnya transparan maka ada cara lain untuk melakukan ini, di mana urutan di mana Anda menggambar dua poligon tidak penting, tetapi itu mulai masuk ke konsep yang lebih maju seperti ambang batas alfa. Mungkin tidak diperlukan untuk situasi Anda saat ini.

Trevor Powell
sumber