วิธีการสร้างพื้นผิวที่โปร่งใสบางส่วน?


13

อรุณสวัสดิ์ StackOverflow ฉันมีปัญหาเล็กน้อยในขณะนี้เนื่องจากฉันไม่สามารถหาวิธีที่จะแสดงส่วนหนึ่งของพื้นผิวได้อย่างโปร่งใสด้วย openGL

นี่คือการตั้งค่าของฉัน: ฉันมีรูปสี่เหลี่ยมที่แสดงถึงผนังปกคลุมด้วยพื้นผิวนี้ (แปลงเป็น PNG สำหรับวัตถุประสงค์ในการอัปโหลด) เห็นได้ชัดว่าฉันต้องการให้ผนังทึบแสงยกเว้นบานกระจก มีระนาบอื่นด้านหลังกำแพงซึ่งควรจะแสดงภูมิทัศน์ ฉันต้องการที่จะเห็นภูมิทัศน์จากด้านหลังหน้าต่าง แต่ละพื้นผิวเป็น TGA พร้อมช่องอัลฟา

"แนวนอน" จะแสดงก่อนจากนั้นจึงติดผนัง ฉันคิดว่ามันจะเพียงพอที่จะบรรลุผลนี้ แต่เห็นได้ชัดว่าไม่ใช่กรณี ส่วนของหน้าต่างที่ควรจะโปร่งใสคือสีดำและภูมิทัศน์จะปรากฏเฉพาะเมื่อฉันเคลื่อนผ่านกำแพง

ฉันพยายามที่จะเล่นซอกับ GLBlendFunc () หลังจากเปิดใช้งานมัน แต่มันดูเหมือนจะไม่หลอกลวง

ฉันลืมขั้นตอนสำคัญหรือไม่

ขอขอบคุณ :)


สวัสดียินดีต้อนรับสู่ gdse ฉันทำการแก้ไขเล็กน้อยเราไม่ชอบการวางแท็กไว้ในคำถามที่มีหัวเรื่องมาก (โดยเฉพาะเมื่อคุณใช้แท็กเดียวกันในแท็ก :)) และสำหรับคำถามของคุณ คุณกำลังใช้ท่อส่งคงที่หรือตัวสร้างเฉดสีของคุณหรือไม่?
Notabene

ขอบคุณสำหรับการแก้ไข ฉันไม่แน่ใจเกี่ยวกับความหมายของ "ท่อส่งคงที่" แต่ฉันสร้างจุดสุดยอดด้วยตนเองทุกครั้งและฉันไม่ใช้ shader ใด ๆ หากเป็นสิ่งสำคัญฉันไม่ได้ใช้เวอร์ชันล่าสุดของ openGL เนื่องจากเป็นงานมอบหมายโรงเรียน (ฉันคิดว่าเป็น openGL 3)
megamoustache

มันจะดีถ้าคุณสามารถใส่รูปภาพลงในคำถามของคุณ ดูเหมือนว่าจะหายไปจากตำแหน่งเดิม
หรือผู้ทำแผนที่

คำตอบ:


19

นอกเหนือจากทุกสิ่งที่คุณได้ระบุไว้ (พื้นผิวที่มีช่องอัลฟาวาดภูมิทัศน์ก่อนที่จะวาดผนัง + หน้าต่าง) คุณต้องทำสองสิ่งเพิ่มเติม

ก่อนอื่นคุณต้องเปิดใช้งานฟังก์ชันการผสมของ OpenGL:

glEnable(GL_BLEND);

ประการที่สองคุณต้องบอก OpenGL ถึงวิธีการคำนวณสีของพิกเซลผสม (ซึ่ง OpenGL เรียกว่า "แฟรกเมนต์" โดยบังเอิญ) ในกรณีนี้คุณจะสบายดีกับสิ่งที่เรียบง่ายเช่นนี้:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

เมื่อเปิดการผสมแล้ว OpenGL จะรวมสีของพิกเซลตามพารามิเตอร์ของฟังก์ชั่นที่คุณกำหนดใน glBlendFunc โดยเฉพาะมันจะทำ "source.color * source.alpha + destination.color * (1-source.alpha)" โดยที่ "source" เป็นพื้นผิวที่คุณกำลังแสดงผลในปัจจุบันและ "ปลายทาง" เป็นสีที่มีอยู่แล้วใน framebuffer (ภูมิทัศน์) ดังนั้นเมื่อใดก็ตามที่ช่องอัลฟาของคุณเป็นสีขาวคุณจะได้สีผนังและที่ใดก็ตามที่ช่องอัลฟาเป็นสีดำคุณจะได้สีแนวนอน หากช่องอัลฟาเป็นสีเทาแสดงว่าคุณได้รับสีจางระหว่างสีทั้งสอง

หากหน้าต่างของคุณโปร่งใสอย่างสมบูรณ์มีวิธีอื่นที่จะทำเช่นนี้ซึ่งลำดับที่คุณวาดรูปหลายเหลี่ยมสองรูปนั้นไม่สำคัญเลย อาจไม่จำเป็นสำหรับสถานการณ์ปัจจุบันของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.