ฉันพยายามสร้างเอฟเฟกต์ระยิบระยับสำหรับ shader เรียลไทม์ของฉัน แต่ฉันไม่รู้ว่าจะทำอย่างไร
นี่คือตัวอย่างหนึ่งและอีกตัวอย่างหนึ่ง
ฉันสามารถใช้เทคนิคใดในการทำสิ่งนี้
ฉันพยายามสร้างเอฟเฟกต์ระยิบระยับสำหรับ shader เรียลไทม์ของฉัน แต่ฉันไม่รู้ว่าจะทำอย่างไร
นี่คือตัวอย่างหนึ่งและอีกตัวอย่างหนึ่ง
ฉันสามารถใช้เทคนิคใดในการทำสิ่งนี้
คำตอบ:
เมื่อถูกถามให้ออกแบบ shader เราควรเริ่มจากการทำให้เรื่องเล็ก ๆ น้อยลง และเช่นเดียวกับเอฟเฟกต์วาววับไม่ได้ทำให้ shader ดูดี แต่แสงและเอฟเฟกต์โดยรวมการใช้เพียงอันเดียวจะไม่ดูดี
ก่อนอื่นให้เราระบุสิ่งที่ไม่ได้เป็นส่วนหนึ่งของ shader โดยตรง:
ประการที่สองมาแบ่ง shader จริงออกเป็นเอฟเฟกต์แยก:
โปรดทราบว่าผ้าดังกล่าวมีหลายบรรทัดฐานมากมาย แต่เทคนิคที่อธิบายไว้ที่นี่มีความสำคัญมากที่สุด
เพื่อให้ใกล้เคียงกับปกติที่สำคัญที่สุดวิธีหนึ่งที่จะทำคือการใช้เนื้อพิกัดและเสียบ้างคำนวณของตาข่ายและแทนการคำนวณN Lคุณคำนวณ 1 (NT)
คำอธิบายแบบเต็มนี่ และคุณอาจต้องใช้มันในส่วนที่แตกมากกว่าเทคนิคที่พวกเขาพูดถึง โมเดล anisotropic อื่น ๆ ยังสามารถใช้ได้เช่นกัน
ตอนนี้สำหรับเอฟเฟกต์วาววับ:
ซึ่งสามารถทำได้ในพื้นที่โลก / พื้นที่พื้นผิวท้องถิ่นหรือพื้นที่หน้าจอเป็นบัตรผ่านแยก
อัลกอริทึมที่ฉันสามารถคิดออกใช้เทคนิคการประมวลผลภาพ (สมมติว่าตาข่ายมีพื้นผิวประสาน)
หมายเหตุภาพด้านบนเป็นเพียงตัวอย่างของตัวกรองสูงสุดและการใช้บนสัญญาณรบกวนจะทำให้ sth คล้ายกับฟิลด์ดาว
ตัวอย่างของตัวกรอง Gausian ที่ใช้กับเสียงรบกวนสูงสุด (ed)
หมายเหตุเทคนิคนี้อาจต้องการการเพิ่มประสิทธิภาพที่สำคัญสำหรับ shader แบบเรียลไทม์
มีบทความที่น่าสนใจคือ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);