เค้าโครงทั่วไป:
สร้างแผนที่เชิงลึกของฉากของคุณโดยไม่มีเกราะป้องกัน คุณสามารถรับสิ่งนี้ได้อย่างมีประสิทธิภาพโดยไม่เสียค่าใช้จ่ายเนื่องจากวัตถุโปร่งใสมักจะแสดงผลในเวลาต่อมา มิฉะนั้นคุณสามารถสร้างแผนที่ความลึกได้โดยการสร้างฉากซานซันโล่ลงบนRTTด้วยเครื่องปรับความลึก
แสดงภาพของคุณตามปกติส่งแผนที่ความลึกไปที่โล่ของคุณ
ใน shader ให้คำนวณความแตกต่างของความลึกของฉากจากความลึกของชิ้นส่วนของโล่และใช้ความแตกต่างนั้นเพื่อปรับเปลี่ยนสีของชิ้นส่วน
การสาธิต
ฉันเขียนตัวอย่าง WebGL อย่างง่ายของสิ่งนั้น
ทีละบรรทัด
มาดูรายละเอียดของ shader code ในรายละเอียด:
float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;
ตัวอย่างแผนที่ความลึกในทุกส่วน อย่าลืมแบ่งตามขนาดวิวพอร์ตของคุณเพื่อแปลงแฟรกเมนต์ของคุณจากพื้นที่หน้าจอ [0, ความกว้าง / ความสูง] ไปเป็นพิกัด [0.0, 1.0] ณ จุดนี้ถ้าคุณเพียงแค่ตั้งค่าสีของชิ้นส่วนเป็นพิกเซลแผนที่ความลึกตัวอย่างมันจะมีลักษณะดังนี้:
แผนที่เชิงลึกคือระดับสีเทาดังนั้นคุณสามารถรับค่าจากช่องใด ๆ (ฉันใช้r
ที่นี่)
float solidsDiff = 1.0 - smoothstep(
zNear,
zFar,
gl_FragCoord.z / gl_FragCoord.w
) - solidsDepth;
จากนั้นคุณสามารถใช้ตัวอย่างความลึกนั้นเพื่อค้นหาความแตกต่างระหว่างความลึกของฉากและความลึกของส่วนของโล่ โปรดจำไว้ว่าให้ปรับความลึกของคุณให้เป็นมาตรฐานด้วยการนำจาก [zNear, zFar] (เครื่องบินใกล้และไกลที่สุดในกล้องของคุณ) ไปที่ [0.0, 1.0] smoothstep
ทำอย่างนี้ 1.0 -
คือการกลับค่าดังกล่าวว่าsolidsDiff
เป็น 1.0 เมื่อความแตกต่างคือสูงสุด (zFar - zNear) และ 0.0 ที่ต่ำสุด (0.0)
โปรดทราบว่าฉันได้สันนิษฐานsolidsDepth
แล้วว่าได้รับการทำให้เป็นมาตรฐานในส่วนลึกที่สร้างแผนที่ความลึก
float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));
จากนั้นคุณสามารถปรับเปลี่ยนช่องอัลฟาของโล่ของคุณขึ้นอยู่กับความแตกต่างของความลึก ที่นี่เราเริ่มต้นที่อัลฟาขั้นต่ำจาก0.3
นั้นสร้างอัลฟาที่เพิ่มขึ้นอย่างมากในขณะที่เราใกล้จะ0.0
แตกต่างกัน
- 0.005
ชดเชยเพียงแค่เพิ่มขอบสีขาวที่จะทำให้ "สี่แยก" หนา ลองปรับเปลี่ยนมัน!
gl_FragColor = vec4(vec3(1.0), alpha);
และสุดท้ายใช้อัลฟ่านั้นกับสีส่วนของคุณ
การเพิ่มประสิทธิภาพ
คุณสามารถทำให้โล่โค้งเพิ่มพลาสม่าสำหรับ "พลังงานโล่" มอง (สาธิต)หรือสำรวจผลกระทบที่มีเพียงแค่แยกแสดง (สาธิต)
ท้องฟ้ากราฟฟิกการ์ดของคุณมีขีด จำกัด !