การแมปเงาและ Quads โปร่งใส


10

การแมปเงาใช้บัฟเฟอร์ความลึกเพื่อคำนวณตำแหน่งที่ควรวาดเงา

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

ฉันจะทำให้ quads โปร่งใสของฉันส่งเงาที่ถูกต้องโดยใช้การทำแผนที่เงาได้อย่างไร

คำตอบ:


15

ปัญหาของคุณจะแก้ปัญหาการแสดงผลด้วย 1 บิตอัลฟา ซึ่งหมายความว่าคุณระบุอัลฟาของแหล่งที่มาซึ่งไม่ได้แสดงผล (ส่วนใหญ่ 0.5)

คุณต้องเขียน Shader discardของคุณเองสำหรับการบันทึกความลึกจากการเรียนการสอนและการใช้แสง ยกเลิกมีอยู่ใน hlsl, glsl และ cg เช่นกัน มันมีอยู่ในพิกเซล / ชิ้นส่วน shader และทิ้งส่วนที่ขาดจากการเรนเดอร์ไปสู่ ​​backBuffer และเป็น z-buffer

if (texSample.a < 0.5)
   discard;

ข้อได้เปรียบคือคุณไม่จำเป็นต้องเปลี่ยนการเรนเดอร์ครั้งที่ 2 ของคุณเฉพาะการเรนเดอร์แสงเท่านั้น นอกจากนี้ฉันได้พิสูจน์ว่ามันใช้งานได้: 1 บิตอัลฟา

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

แก้ไข: ฉันเพิ่งรู้ว่าฉันลืมเพิ่มเครดิต เหมือนเคย. แบบจำลองทรีมาจากโครงการวนซ์ซึ่งยอดเยี่ยมมากถ้าคุณกำลังมองหาโพลีต่ำแบบพื้นผิวหนึ่งและแบบจำลองพืชฟรี


6

ด้วยไพพ์ไลน์ที่ตั้งโปรแกรมได้คุณควรทำตามวิธีที่ @notabene สั่ง อย่างไรก็ตามมันเป็นเรื่องง่ายที่จะทำกับท่อคงที่เช่นกันโดยไม่ต้องเขียนเฉดสีใด ๆ ใน OpenGL glAlphaFunc เป็นสิ่งที่คุณต้องการ ตัวอย่างเช่น:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
เรียบร้อย ฉันเกลียดท่อคงที่ ดังนั้นฉันจึงชื่นชมทุกคนที่สามารถทำสิ่งนี้ได้โดยไม่ต้องเสียสละ +1 แน่นอน
Notabene

@Notabene ไม่มีอะไรน่าชื่นชมเกี่ยวกับการใช้เทคโนโลยีที่เลิกใช้แล้ว
Tara

2

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


-1

วิธีเดียวที่ฉันคิดได้ว่าทำสิ่งนี้คือการสร้างพื้นผิวแผนที่ความลึกแยกจากกันแสดงต้นไม้เข้าไปในนั้นแสดงความลึกโดยที่ alpha! = 0 หรือส่งความลึก = 1 จากนั้นรวมพื้นผิวแผนที่เงานี้กับพื้นผิวแผนที่เงาฉาก ซึ่งควรจะง่ายพอ เพียงแค่นำค่าที่น้อยที่สุดจากสองค่าและตั้งค่านั้นไปยังแผนที่ความลึกสุดท้าย

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

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