मैं एक जीएलएसएल शेडर लिख रहा हूं जो सरल वस्तुओं के लिए रंगीन विचलन को अनुकरण करता है। मैं ओपनजीएल 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
एक घन नक्शा है कि तैयार की वस्तु के वातावरण से लाइव प्रदान की गई है है: यहाँ टुकड़ा शेडर है।
सामान्य परिस्थितियों में, शेडर बर्ताव करता है (मुझे लगता है कि) की उम्मीद की तरह, इस परिणाम उपज:
हालांकि, जब कैमरा अपने लक्ष्य के आसपास 180 डिग्री घुमाया जाता है, इतना है कि यह अब कम से बताते हैं दूसरी तरफ से वस्तु, अपवर्तित/परिलक्षित छवि इतनी तरह विकृत हो जाता है (यह निश्चित रूप से, 0 और 180 डिग्री के बीच कोण के लिए धीरे-धीरे होता है):
कैमरे को कम/उठाए जाने पर समान कलाकृतियों को प्रकट होता है; यह कैमरा केवल 100% सही तरीके से व्यवहार करता है जब कैमरा सीधे लक्षित ऑब्जेक्ट (नकारात्मक जेड की तरफ इशारा करते हुए) पर होता है।
मुझे यह पता लगाने में परेशानी हो रही है कि इस विकृत छवि के लिए जिम्मेदार शेडर में कौन सा परिवर्तन है, लेकिन यह cameraPos
को कैसे संभाला जाता है उससे संबंधित कुछ स्पष्ट होना चाहिए। इस तरह से छवि को खुद को घुमाने के कारण क्या हो रहा है?
यह था! मुझे स्पष्ट कारणों से 'mat3 (modelMatrix) 'द्वारा' gl_NormalMatrix' को भी प्रतिस्थापित करना था। यह मुझे कभी नहीं मारा कि मुझे 'स्थिति' चर की जगह पर विचार करना चाहिए, ऐसा लगता है कि यह किसी भी तरह से मामूली रूप से सही साबित होता है। धन्यवाद! – dflemstr