ฉันจะบอกให้ shader ชิ้นส่วนไม่เขียนพิกเซลได้อย่างไร


11

ใน WebGL ฉันต้องการส่ง quad space space ผ่านหน้าจอที่ได้รับการประมวลผลโดย shader แฟรกเมนต์ แต่ให้ shader แฟรกเมนต์เขียนเฉพาะพิกเซลภายใต้เงื่อนไขบางอย่างเท่านั้น (พูดว่า ... ว่ามันอยู่ในวงกลมหรือ พิกเซลเป็นของด้านบวกของ halfspace ที่กำหนดโดยสมการเส้นโค้งหรือบางสิ่ง)

เป็นไปได้ภายในตัวแบ่งส่วนที่จะพูดว่า "อย่าเขียนพิกเซล" หรือไม่?

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

มีวิธีที่จะทำให้ shader ส่วนเลือกที่จะไม่เขียนพิกเซลเลยหรือไม่?

คำตอบ:


10

ใช่คุณสามารถdiscardใช้ตัวแบ่งส่วนเพื่อหลีกเลี่ยงการเขียนพิกเซล นี่คือตัวอย่างแบบสุ่มที่ฉันขุดขึ้นมาจาก Google

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

คุณอาจสนใจคำถามdiscardที่เกี่ยวข้องนี้เกี่ยวกับประสิทธิภาพและคำถามนี้ใน SO

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


3

discardคำสั่งมาในสะดวก

คุณไม่ได้พูดมากเกินไปเกี่ยวกับเส้นทางการตัดสินใจของคุณดังนั้นฉันจะเสนอตัวอย่างโดยใช้การค้นหาพื้นผิวอย่างง่าย:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(มาจากรหัสตัวอย่างที่ฉันเขียนก่อนที่ฉันจะเรียนรู้เกี่ยวกับการผสมอัลฟา)

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