Reflexão / refração com aberração cromática - correção ocular
Estou escrevendo um shader GLSL que simula aberração cromática para objetos simples. Como sou compatível com OpenGL 2.0, uso a pilha de matriz OpenGL incorporada. Este é o shader de vértice simples:
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();
}
OcameraPos
uniforme é a posição da câmera no espaço do modelo, como se pode imaginar. Aqui está o shader de fragmento:
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);
}
Oenvironment
é um mapa de cubo que é renderizado ao vivo a partir do ambiente do objeto desenhad
m circunstâncias normais, o shader se comporta (eu acho) como esperado, produzindo este resultad
No entanto, quando a câmera é girada 180 graus em torno de seu alvo, de modo que agora aponta para o objeto do outro lado, a imagem refratada / refletida fica distorcida dessa maneira (isso acontece gradualmente para ângulos entre 0 e 180 graus, é claro ):
Artefatos semelhantes aparecem quando a câmera é abaixada / elevada; apenas parece se comportar 100% corretamente quando a câmera está diretamente sobre o objeto de destino (apontando para Z negativo, neste caso).
Estou tendo problemas para descobrir qual transformação no shader é responsável por essa imagem distorcida, mas deve haver algo óbvio relacionado a comocameraPos
É tratado. O que está causando a imagem se distorcer dessa maneira?