आप रंगों के साथ रंगीन विपथन के प्रभाव को कैसे लागू करेंगे ?
क्या प्रत्येक रंग के लिए अलग-अलग फोकस दूरी के साथ दुनिया का प्रतिपादन समस्या को हल करेगा (शायद केवल एक गहराई रेंडरिंग पास के उपयोग के साथ)?
आप रंगों के साथ रंगीन विपथन के प्रभाव को कैसे लागू करेंगे ?
क्या प्रत्येक रंग के लिए अलग-अलग फोकस दूरी के साथ दुनिया का प्रतिपादन समस्या को हल करेगा (शायद केवल एक गहराई रेंडरिंग पास के उपयोग के साथ)?
जवाबों:
जब एक लेंस एक ही फोकल बिंदु पर हर रंग को केंद्रित नहीं कर सकता है, तो क्रोमैटिक विपथन होता है। इस प्रभाव को नकली करने का एक सरल तरीका है, और इसे एक त्वरित फ़ुल-स्क्रीन पोस्ट-प्रोसेस के रूप में प्रस्तुत करना है, प्रत्येक रंग चैनल के लिए एक टुकड़े टुकड़े में एक ऑफसेट लागू करना है।
प्रत्येक चैनल के लिए एक अलग ऑफसेट का उपयोग करके, आप वांछित प्रभाव का एक उचित प्रतिकृति प्राप्त कर सकते हैं। इस तकनीक का एक उदाहरण यहां पाया जा सकता है ; टुकड़ा 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);
// ...
}
तब आप उस वेक्टर को एक टुकड़े की बनावट (पर्यावरण के मानचित्र में) देखने के लिए टुकड़े टुकड़े में उपयोग करेंगे। आमतौर पर यह एक प्रतिबिंब प्रभाव के साथ-साथ किया जाता है, और संयुक्त एक गणना का उपयोग किया जाता है Fresnel शब्द का ।
रंगीन विपथन का अनुकरण करने के लिए, आप तीन अलग-अलग अपवर्तन वेक्टर अभिकलन कर सकते हैं , प्रत्येक एक अपवर्तन के विभिन्न सूचकांकों के माध्यम से थोड़ा सा ऑफसेट होता है: शीर्षस्थ छाया में:
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);
}
अधिक जानकारी के लिए, ओपनजीएल ऑरेंज बुक उपलब्ध है और इसमें मूल प्रतिबिंब और अपवर्तन प्रभाव का एक उदाहरण है, साथ ही साथ रंगीन विपथन प्रभाव का एक उदाहरण भी है।