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:
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:
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?
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