आप रंगीन विपथन कैसे लागू करेंगे?


22

आप रंगों के साथ रंगीन विपथन के प्रभाव को कैसे लागू करेंगे ?

क्या प्रत्येक रंग के लिए अलग-अलग फोकस दूरी के साथ दुनिया का प्रतिपादन समस्या को हल करेगा (शायद केवल एक गहराई रेंडरिंग पास के उपयोग के साथ)?


आप वर्णव्यवस्था को लागू क्यों करना चाहेंगे?
राख 14

3
आप उसी तरह आगे बढ़ सकते हैं जिस तरह से ब्‍लूम हासिल किया जाता है। आपको अपने सामान्य दृश्य को इसके 3 धुंधले संस्करणों के साथ जोड़ना चाहिए; इन तीन बनावटों में से प्रत्येक को मुख्य रूप से 3 मूल रंगों में रंगा जाना चाहिए .. बेशक, विविधताएं संभव हैं यदि आप 3 बनावट के लिए अलग-अलग धब्बा रणनीतियों का उपयोग करते हैं (उदाहरण के लिए अलग-अलग कोणीय ऑफसेट चालें कर सकते हैं)।
टेओड्रन

3
@ ashes999 - शायद यथार्थवाद का एक स्पर्श जोड़ने के लिए एक स्नाइपर गुंजाइश या अन्य लंबे लेंस? Chromatic aberration कई यौगिक लेंस डिज़ाइनों की एक कलाकृति है।
कीथ्स

आप एक लेंस के कारण होने वाले किसी भी विपथन का सामना करने के लिए रंगीन विपथन को लागू करना चाह सकते हैं जिसके माध्यम से खेल को देखा जा रहा है। उदाहरण के लिए, ओकुलस रिफ्ट के साथ खेले जाने वाले खेल में दृश्य के किनारों पर रंगीन विपथन होना एक अच्छा विचार है।
जोसेफ मैन्सफील्ड

जवाबों:


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);

    // ...
}

तब आप उस वेक्टर को एक टुकड़े की बनावट (पर्यावरण के मानचित्र में) देखने के लिए टुकड़े टुकड़े में उपयोग करेंगे। आमतौर पर यह एक प्रतिबिंब प्रभाव के साथ-साथ किया जाता है, और संयुक्त एक गणना का उपयोग किया जाता है 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);
}

अधिक जानकारी के लिए, ओपनजीएल ऑरेंज बुक उपलब्ध है और इसमें मूल प्रतिबिंब और अपवर्तन प्रभाव का एक उदाहरण है, साथ ही साथ रंगीन विपथन प्रभाव का एक उदाहरण भी है।


क्या एक दृष्टिकोण है जो केवल एक बनावट के नमूने का उपयोग करता है और बस इसे टिंट करता है? यह किरण अनुरेखण जैसे अनुप्रयोगों के लिए बहुत फायदेमंद होगा, जहां तीन बनाम एक किरण का पता लगाना बहुत महंगा है।
तारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.