ฉันจะสร้างประกายแวววาวได้อย่างไร?


9

ฉันพยายามสร้างเอฟเฟกต์ระยิบระยับสำหรับ shader เรียลไทม์ของฉัน แต่ฉันไม่รู้ว่าจะทำอย่างไร

นี่คือตัวอย่างหนึ่งและอีกตัวอย่างหนึ่ง

ป้อนคำอธิบายรูปภาพที่นี่

ฉันสามารถใช้เทคนิคใดในการทำสิ่งนี้


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

1
แผนที่ปกติและแบบพิเศษจะไม่อนุญาตให้คุณทำสิ่งนี้ผ่านทางพื้นผิวหรือไม่?
JohnB

ฉันทำการทดสอบโดยใช้แผนที่ปกติ แต่สิ่งที่ยากคือการทำให้พวกมันส่องแสงตามทิศทางของมุมมองและทิศทางของแสง
เสื่อ

คำตอบ:


10

เมื่อถูกถามให้ออกแบบ shader เราควรเริ่มจากการทำให้เรื่องเล็ก ๆ น้อยลง และเช่นเดียวกับเอฟเฟกต์วาววับไม่ได้ทำให้ shader ดูดี แต่แสงและเอฟเฟกต์โดยรวมการใช้เพียงอันเดียวจะไม่ดูดี

ก่อนอื่นให้เราระบุสิ่งที่ไม่ได้เป็นส่วนหนึ่งของ shader โดยตรง:

  1. การแชโดว์ไม่ได้เป็นส่วนหนึ่งของ shader และทำได้ผ่านการแชโดว์แบบแยก
  2. ฉันคิดว่ามีการปิดล้อมโดยรอบ (โดยเฉพาะภาพที่แสดงในคำถามนี้โดยเฉพาะไม่ใช้ตัวเรนเดอร์เรียลไทม์ แต่เป็นข้อสันนิษฐาน)

ประการที่สองมาแบ่ง shader จริงออกเป็นเอฟเฟกต์แยก:

  1. มีแสงแบบแอนไอโซทรอปิกนี่เป็นสิ่งสำคัญมากสำหรับลักษณะโดยรวมของ shader เหตุผลที่อยู่เบื้องหลังนี้คือวัสดุที่เกิดขึ้นจริงมีผ้าเนื้อผ้าเงางามเหล่านี้ทำให้การสะท้อนแสงมีอคติทิศทางการทำมากที่สุดจำนวนของแสงที่สะท้อนออกมาในทิศทางที่แน่นอนว่า

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่ โปรดทราบว่าผ้าดังกล่าวมีหลายบรรทัดฐานมากมาย แต่เทคนิคที่อธิบายไว้ที่นี่มีความสำคัญมากที่สุด

เพื่อให้ใกล้เคียงกับปกติที่สำคัญที่สุดวิธีหนึ่งที่จะทำคือการใช้เนื้อพิกัดและเสียบ้างคำนวณของตาข่ายและแทนการคำนวณN Lคุณคำนวณ 1 (NT)

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

ตอนนี้สำหรับเอฟเฟกต์วาววับ:

ซึ่งสามารถทำได้ในพื้นที่โลก / พื้นที่พื้นผิวท้องถิ่นหรือพื้นที่หน้าจอเป็นบัตรผ่านแยก

อัลกอริทึมที่ฉันสามารถคิดออกใช้เทคนิคการประมวลผลภาพ (สมมติว่าตาข่ายมีพื้นผิวประสาน)

  • สร้างเสียง 2 มิติความถี่สูงบนพื้นผิวตาข่ายโดยใช้พิกัดพื้นผิวของมันเสียงเพอร์ลินน่าจะเป็นตัวเลือกที่ดี
  • ใช้ตัวกรองสูงสุดโดยใช้เคอร์เนล 3x3 กับเสียงรบกวน นี้จะสร้างผลคล้ายกับภาพด้านล่างและตัวกรองสูงสุดอธิบายไว้ที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุภาพด้านบนเป็นเพียงตัวอย่างของตัวกรองสูงสุดและการใช้บนสัญญาณรบกวนจะทำให้ sth คล้ายกับฟิลด์ดาว

  • เมื่อคุณทำสิ่งนี้แล้วให้ใช้ตัวกรองเกาส์เซียนที่มีส่วนเบี่ยงเบนเสียงรบกวน

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างของตัวกรอง Gausian ที่ใช้กับเสียงรบกวนสูงสุด (ed)

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

หมายเหตุเทคนิคนี้อาจต้องการการเพิ่มประสิทธิภาพที่สำคัญสำหรับ shader แบบเรียลไทม์


3

มีบทความที่น่าสนใจคือAMD - การดำเนินการการขั้นตอน

ดูเหมือนว่าประกายไฟจะหนักกว่าที่ฉันคิด
วิธีการแก้ปัญหาที่ดี: ใช้ตำแหน่ง 3D เพื่อจัดทำดัชนีฟังก์ชั่นสัญญาณรบกวน 3D เพิ่มเวกเตอร์มุมมองใช้ฟังก์ชั่น frac เพื่อสุ่มสิ่งต่างๆเพิ่มเติม

Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.