คุณจะใช้ผลของความคลาดเคลื่อนสีกับเฉดสีได้อย่างไร?
การเรนเดอร์ของโลกที่มีระยะโฟกัสที่แตกต่างกันสำหรับแต่ละสีจะแก้ปัญหาได้หรือไม่
คุณจะใช้ผลของความคลาดเคลื่อนสีกับเฉดสีได้อย่างไร?
การเรนเดอร์ของโลกที่มีระยะโฟกัสที่แตกต่างกันสำหรับแต่ละสีจะแก้ปัญหาได้หรือไม่
คำตอบ:
ความผิดเพี้ยนของสีเกิดขึ้นเมื่อเลนส์ไม่สามารถโฟกัสได้ทุกสีในจุดโฟกัสเดียวกัน วิธีง่าย ๆ ในการปลอมเอฟเฟกต์นี้และทำให้เป็นโพสต์แบบเต็มหน้าจออย่างรวดเร็วคือการใช้ออฟเซ็ตกับแต่ละช่องสีในส่วนย่อย
ด้วยการใช้ออฟเซ็ตที่แตกต่างกันสำหรับแต่ละช่องคุณสามารถรับโทรสารที่เหมาะสมของเอฟเฟกต์ที่ต้องการ ตัวอย่างของเทคนิคนี้สามารถพบได้ที่นี่ ; ชิ้นส่วน 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มีให้บริการและมีตัวอย่างของการสะท้อนพื้นฐานและเอฟเฟกต์การหักเหเช่นเดียวกับตัวอย่างของเอฟเฟกต์ความคลาดสี