คุณจะใช้ความคลาดสีอย่างไร?


22

คุณจะใช้ผลของความคลาดเคลื่อนสีกับเฉดสีได้อย่างไร?

การเรนเดอร์ของโลกที่มีระยะโฟกัสที่แตกต่างกันสำหรับแต่ละสีจะแก้ปัญหาได้หรือไม่


ทำไมคุณต้องการที่จะใช้ abberation สี?
ashes999

3
คุณสามารถทำแบบเดียวกับที่ทำได้ คุณควรรวมฉากปกติของคุณเข้ากับฉาก 3 เบลอ พื้นผิวทั้งสามเหล่านี้แต่ละสีควรได้รับการย้อมสีส่วนใหญ่ในสีพื้นฐาน 3 สีแน่นอนว่าความผันแปรอาจเกิดขึ้นได้หากคุณใช้กลยุทธ์การเบลอที่แตกต่างกันสำหรับพื้นผิว 3 แบบ (เช่นความไม่ชัดเจนของทิศทาง
teodron

3
@ ashes999 - อาจเป็นขอบเขตสไนเปอร์หรือเลนส์ยาวอื่น ๆ เพื่อเพิ่มความสมจริง ความคลาดเคลื่อนสีเป็นสิ่งประดิษฐ์ของเลนส์คอมโพสิตหลายแบบ
KeithS

คุณอาจต้องการใช้ความคลาดเคลื่อนสีเพื่อตอบโต้ความผิดปกติใด ๆ ที่เกิดจากเลนส์ที่มีการดูเกม ตัวอย่างเช่นมันเป็นความคิดที่ดีที่จะมีความคลาดเคลื่อนสีที่ขอบของมุมมองในเกมที่เล่นกับ Oculus Rift
Joseph Mansfield

คำตอบ:


22

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

ด้วยการใช้ออฟเซ็ตที่แตกต่างกันสำหรับแต่ละช่องคุณสามารถรับโทรสารที่เหมาะสมของเอฟเฟกต์ที่ต้องการ ตัวอย่างของเทคนิคนี้สามารถพบได้ที่นี่ ; ชิ้นส่วน shader จะมีลักษณะเช่นนี้:

void main () {
    // Previously, you'd have rendered your complete scene into a texture
    // bound to "fullScreenTexture."
    vec4 rValue = texture2D(fullscreenTexture, gl_TexCoords[0] - rOffset);  
    vec4 gValue = texture2D(fullscreenTexture, gl_TexCoords[0] - gOffset);
    vec4 bValue = texture2D(fullscreenTexture, gl_TexCoords[0] - bOffset);  

    // Combine the offset colors.
    gl_FragColor = vec4(rValue.r, gValue.g, bValue.b, 1.0);
}

แฮ็กธรรมดานี้ไม่ได้คำนึงถึงข้อเท็จจริงที่ว่าความผิดเพี้ยนของสีเป็นเอฟเฟกต์ของเลนส์แม้ว่า: เพื่อให้ได้การจำลองที่ดีขึ้นคุณต้องทำให้บางสิ่งบางอย่างเป็นเลนส์ สิ่งนี้คล้ายกับวิธีที่คุณแสดงวัตถุที่มีการสะท้อนแสงหรือการหักเหของแสง ดังนั้นการสะท้อน / การหักเหของแสงทั่วไปจึงเป็นพื้นฐานของการใช้ความคลาดสี

โดยปกติคุณจะคำนวณเวกเตอร์การหักเหเดียวโดยใช้เวกเตอร์มุมมองและดัชนีการหักเหที่กำหนดไว้โดยใช้ฟังก์ชันการหักเหของ GLSL ในจุดยอด:

void main () {
    // ...

    // RefractionVector is a varying vec3.
    // 'ratio' is the ratio of the two indices of refraction.
    RefractionVector = refract(incidentVector, normalVector, ratio);

    // ...
}

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

ในการจำลองความคลาดเคลื่อนของสีคุณสามารถทำการคำนวณการหักเหเวกเตอร์สามแบบซึ่งแต่ละอันจะหักล้างเล็กน้อยผ่านดัชนีการหักเหที่แตกต่างกันใน shader ที่:

void main () {
    // ...

    // RefractionVector is a varying vec3, as above.
    // 'ratioR,' et cetera, is the ratio of indices of refraction for
    // the red, green and blue components respectively.
    RedRefractionVector = refract(incidentVector, normalVector, ratioR);
    GreenRefractionVector = refract(incidentVector, normalVector, ratioG);
    BlueRefractionVector = refract(incidentVector, normalVector, ratioB);

    // ...
}

เวกเตอร์สามตัวที่แตกต่างกันเหล่านั้นสามารถใช้เพื่อทำการค้นหาคิวบ์แผนที่สามแบบที่แตกต่างกันซึ่งสามารถผสมเข้าด้วยกันคล้ายกับวิธีการผสมสีในตัวอย่างง่าย ๆ :

void main () {
    vec3 color;
    color.r = vec3(textureCube(EnvironmentMap, RedRefractionVector)).r;
    color.g = vec3(textureCube(EnvironmentMap, GreenRefractionVector)).g;
    color.b = vec3(textureCube(EnvironmentMap, BlueRefractionVector)).b;

    gl_FragColor = vec4(color, 1.0);
}

สำหรับรายละเอียดเพิ่มเติมOpenGL Orange Bookมีให้บริการและมีตัวอย่างของการสะท้อนพื้นฐานและเอฟเฟกต์การหักเหเช่นเดียวกับตัวอย่างของเอฟเฟกต์ความคลาดสี


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