2012-03-23 13 views
6

मैं एक जीएलएसएल शेडर लिख रहा हूं जो सरल वस्तुओं के लिए रंगीन विचलन को अनुकरण करता है। मैं ओपनजीएल 2.0 संगत रह रहा हूं, इसलिए मैं अंतर्निहित ओपनजीएल मैट्रिक्स स्टैक का उपयोग करता हूं।रंगीन विचलन के साथ प्रतिबिंब/अपवर्तन - आंख सुधार

uniform vec3 cameraPos; 

varying vec3 incident; 
varying vec3 normal; 

void main(void) { 
    vec4 position = gl_ModelViewMatrix * gl_Vertex; 
    incident = position.xyz/position.w - cameraPos; 
    normal = gl_NormalMatrix * gl_Normal; 

    gl_Position = ftransform(); 
} 

cameraPos वर्दी, मॉडल अंतरिक्ष में कैमरा की स्थिति है के रूप में एक सोच सकता है: यह सरल शिखर शेडर है।

const float etaR = 1.14; 
const float etaG = 1.12; 
const float etaB = 1.10; 
const float fresnelPower = 2.0; 
const float F = ((1.0 - etaG) * (1.0 - etaG))/((1.0 + etaG) * (1.0 + etaG)); 

uniform samplerCube environment; 

varying vec3 incident; 
varying vec3 normal; 

void main(void) { 
    vec3 i = normalize(incident); 
    vec3 n = normalize(normal); 

    float ratio = F + (1.0 - F) * pow(1.0 - dot(-i, n), fresnelPower); 

    vec3 refractR = vec3(gl_TextureMatrix[0] * vec4(refract(i, n, etaR), 1.0)); 
    vec3 refractG = vec3(gl_TextureMatrix[0] * vec4(refract(i, n, etaG), 1.0)); 
    vec3 refractB = vec3(gl_TextureMatrix[0] * vec4(refract(i, n, etaB), 1.0)); 

    vec3 reflectDir = vec3(gl_TextureMatrix[0] * vec4(reflect(i, n), 1.0)); 

    vec4 refractColor; 
    refractColor.ra = textureCube(environment, refractR).ra; 
    refractColor.g = textureCube(environment, refractG).g; 
    refractColor.b = textureCube(environment, refractB).b; 

    vec4 reflectColor; 
    reflectColor = textureCube(environment, reflectDir); 

    vec3 combinedColor = mix(refractColor, reflectColor, ratio); 

    gl_FragColor = vec4(combinedColor, 1.0); 
} 

environment एक घन नक्शा है कि तैयार की वस्तु के वातावरण से लाइव प्रदान की गई है है: यहाँ टुकड़ा शेडर है।

सामान्य परिस्थितियों में, शेडर बर्ताव करता है (मुझे लगता है कि) की उम्मीद की तरह, इस परिणाम उपज:

correct shader behavior

हालांकि, जब कैमरा अपने लक्ष्य के आसपास 180 डिग्री घुमाया जाता है, इतना है कि यह अब कम से बताते हैं दूसरी तरफ से वस्तु, अपवर्तित/परिलक्षित छवि इतनी तरह विकृत हो जाता है (यह निश्चित रूप से, 0 और 180 डिग्री के बीच कोण के लिए धीरे-धीरे होता है):

incorrect shader behavior

कैमरे को कम/उठाए जाने पर समान कलाकृतियों को प्रकट होता है; यह कैमरा केवल 100% सही तरीके से व्यवहार करता है जब कैमरा सीधे लक्षित ऑब्जेक्ट (नकारात्मक जेड की तरफ इशारा करते हुए) पर होता है।

मुझे यह पता लगाने में परेशानी हो रही है कि इस विकृत छवि के लिए जिम्मेदार शेडर में कौन सा परिवर्तन है, लेकिन यह cameraPos को कैसे संभाला जाता है उससे संबंधित कुछ स्पष्ट होना चाहिए। इस तरह से छवि को खुद को घुमाने के कारण क्या हो रहा है?

उत्तर

2

यह मेरे लिए संदिग्ध दिखाई देता है:

vec4 position = gl_ModelViewMatrix * gl_Vertex; 
incident = position.xyz/position.w - cameraPos; 

अपने cameraPos दुनिया अंतरिक्ष में परिभाषित किया है? आप एक अनुमानित अंतरिक्ष स्थान cameraPos वेक्टर से, दृश्य स्थान वेक्टर (position) घटा रहे हैं। आपको या तो विश्व अंतरिक्ष में गणना करने या अंतरिक्ष देखने की आवश्यकता है, लेकिन आप उन्हें मिश्रण नहीं कर सकते हैं।

विश्व अंतरिक्ष में इसे सही ढंग से करने के लिए आपको विश्व अंतरिक्ष घटना वेक्टर प्राप्त करने के लिए मॉडल मैट्रिक्स को अलग से अपलोड करना होगा।

+0

यह था! मुझे स्पष्ट कारणों से 'mat3 (modelMatrix) 'द्वारा' gl_NormalMatrix' को भी प्रतिस्थापित करना था। यह मुझे कभी नहीं मारा कि मुझे 'स्थिति' चर की जगह पर विचार करना चाहिए, ऐसा लगता है कि यह किसी भी तरह से मामूली रूप से सही साबित होता है। धन्यवाद! – dflemstr

संबंधित मुद्दे