2012-03-23 24 views
6

Basit nesneler için renk sapmasını simüle eden bir GLSL gölgelendirici yazıyorum. OpenGL 2.0 uyumlu kalıyorum, bu yüzden yerleşik OpenGL matris yığınını kullanıyorum. bir tahmin edeceğiniz gibiRenk sapması ile yansıma/kırılma - göz düzeltme

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 üniforma, model uzayında kamera pozisyonudur: Bu basit tepe tarayıcı olduğunu.

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 çizilen nesnenin çevresinden canlı kılınmış bir küp haritasıdır: İşte parça gölgelendirici olduğunu. Normal şartlar altında

shader (Sanırım) beklenen gibi davranır, bu sonucu elde:

correct shader behavior artık işaret böylece kamera, hedefine etrafında 180 derece döndürüldüğünde Ancak

, diğer taraftan bir amacı, parçalanmış/yansıtılan resmi (bu tabii ki, 0 ve 180 derece arasında açılar için kademeli olarak gerçekleşir) şöyle çarpık alır:

incorrect shader behavior

Fotoğraf makinesi indirildiğinde/kaldırıldığında, benzer yapay nesneler görünür; Sadece kamera doğrudan hedef nesnenin üzerindeyken (bu durumda negatif Z'ye işaret ederek)% 100 doğru davranıyor gibi görünüyor.

Bu çarpık görüntüden sorumlu olan gölgelendiricide hangi dönüşümü belirlediğimde sorun yaşıyorum, ancak cameraPos'un nasıl ele alındığına ilişkin açık bir şey olması gerekir. Görüntünün bu şekilde kendini çarpmasına neden olan nedir?

cevap

2

Bu benim için tekin gözükmüyor:

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

senin cameraPos Dünya uzayda tanımlanmış mı? Sözde dünya alanı cameraPos vektöründen bir görüntü uzay vektörü (position) çıkarıyorsunuz. Ya hesaplamayı dünya uzayında ya da görüntü alanında yapmanız gerekir, ancak bunları karıştıramazsınız.

Dünya uzayında bunu doğru yapmak için, dünya uzay olay vektörünü elde etmek için model matrisini ayrı ayrı yüklemeniz gerekir.

+0

Bu o kadardı! Ayrıca bariz nedenlerle 'gl_NormalMatrix' yerine mat3 (modelMatrix)' yerine geçmek zorunda kaldım. Sadece 'pozisyon' değişkeninin alanını göz önünde bulundurmam gerektiğine hiç bir zaman vuruyordu, bir şekilde önemsiz gibi görünüyordu. Teşekkürler! – dflemstr