ฉันพยายามจำลองเอฟเฟกต์ร่างเรืองแสงในเกม Left 4 Dead เอฟเฟกต์ทำให้วัตถุมีการเรืองแสงแม้ว่าวัตถุจะถูกบัง นี่คือภาพหน้าจอของเอฟเฟกต์:
ฉันสามารถทำซ้ำเอฟเฟกต์นี้ในโปรแกรมที่ใช้ OpenGL ได้บ้าง นี่คือสิ่งที่ฉันกำลังทำอยู่:
- สร้างพื้นผิวสีและความลึกที่มีขนาดครึ่งหนึ่งของขนาดหน้าจอสำหรับแสดงวัตถุที่เรืองแสง
- ล้างพื้นผิวสี / แสงที่เรืองแสง สีจะถูกล้างเป็นสีดำ
- สำหรับวัตถุที่ส่องแสงแต่ละอันให้ฉายไปบนพื้นผิวเรืองแสงเป็นสีทึบ
- ทำการเบลอเกาส์แยกไม่ออกบนพื้นผิวเรืองแสง
- ทำให้ฉากความละเอียดเต็มตามปกติ
- ผสมผสานพื้นผิวเรืองแสงเข้ากับฉากปกติอย่างแนบเนียน แต่ใช้พื้นผิวความลึกของแสงเรืองแสงเพื่อปกปิดวัตถุออกมาเหลือเพียงโครงร่างที่เบลอ
นี่คือภาพหน้าจอของแนวทางของฉัน:
นี่คือ shader ส่วนที่รวมพื้นผิวเรืองแสงกับฉาก:
uniform sampler2D glowColorTex;
uniform sampler2D glowDepthTex;
uniform sampler2D sceneColorTex;
void main()
{
vec2 uv = gl_TexCoord[0].st;
vec4 color = texture2D( sceneColorTex, uv);
float depth = texture2D( glowDepthTex, uv).r;
if(depth == 1.0) {
color += 2.0 * texture2D( glowColorTex, uv);
}
gl_FragColor = color;
}
อย่างที่คุณเห็นมันทำงานได้เป็นส่วนใหญ่ แต่นามแฝงบนโครงร่างนั้นแย่มาก
ใครบ้างมีคำแนะนำสำหรับการทำให้ขอบด้านในของโครงร่างราบรื่นขึ้น?
ฉันควรจะสุ่มตัวอย่างค่าความลึกที่อยู่ใกล้เคียงของแต่ละพิกเซลและปรับขนาดการเรืองแสงตามจำนวนค่าความลึกที่เท่ากับ 1.0 หรือไม่
หรือมีวิธีการที่ดีกว่าที่จะให้ผลลัพธ์ที่ราบรื่นยิ่งขึ้น?