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?

questionAnswers(2)

yourAnswerToTheQuestion