Kromatik sapmanın etkisini gölgelendiricilerle nasıl uygularsınız ?
Dünyanın her bir renk için farklı odak mesafelerine sahip olması sorunu çözer mi?
Kromatik sapmanın etkisini gölgelendiricilerle nasıl uygularsınız ?
Dünyanın her bir renk için farklı odak mesafelerine sahip olması sorunu çözer mi?
Yanıtlar:
Renk sapması, bir merceğin her rengi aynı odak noktasına odaklayamadığı durumlarda ortaya çıkar. Bu efekti taklit etmenin ve hızlı bir tam ekran sonrası işlem olarak göstermenin basit bir yolu, bir parça gölgelendiricideki her renk kanalına bir kaydırma yapmaktır.
Her kanal için farklı bir ofset kullanarak, istenen efekt için makul bir faks elde edebilirsiniz. Bu tekniğin bir örneği burada bulunabilir ; parça gölgelendirici şunun gibi görünür:
void main () {
// Previously, you'd have rendered your complete scene into a texture
// bound to "fullScreenTexture."
vec4 rValue = texture2D(fullscreenTexture, gl_TexCoords[0] - rOffset);
vec4 gValue = texture2D(fullscreenTexture, gl_TexCoords[0] - gOffset);
vec4 bValue = texture2D(fullscreenTexture, gl_TexCoords[0] - bOffset);
// Combine the offset colors.
gl_FragColor = vec4(rValue.r, gValue.g, bValue.b, 1.0);
}
Bu basit hack, renk sapmalarının objektif etkisi olduğu gerçeğini hesaba katmıyor, ancak: daha iyi bir simülasyon elde etmek için objektif olarak hareket edecek bir şey yapmak isteyeceksiniz. Bu, yansıtıcı veya kırıcı nesneleri nasıl yaptığınıza benzer. Sonuç olarak, tipik bir yansıma / kırılma gölgelendiricisi, renk sapmalarını uygulamak için temel olabilir.
Normalde, bir tepe noktası gölgesinde GLSL'nin kırılma işlevini kullanarak bir görünüm vektörüne ve tanımlanmış bir kırılma indeksine dayanan tek bir kırılma vektörünü hesaplarsınız :
void main () {
// ...
// RefractionVector is a varying vec3.
// 'ratio' is the ratio of the two indices of refraction.
RefractionVector = refract(incidentVector, normalVector, ratio);
// ...
}
Sonra bir küp doku araması yapmak için (bir çevre haritasına) bu vektörü bir parça gölgelendiricide kullanırsınız. Tipik olarak bu da bir yansıma etkisinin yanında yapılır ve birleşik Fresnel terimi kullanılır .
Kromatik sapmayı simüle etmek için, o zaman, her biri farklı kırılma indeksleri ile hafifçe kaydırılan üç farklı kırılma vektörü hesaplamasını tepe gölgelendiricisinde yapabilirsiniz:
void main () {
// ...
// RefractionVector is a varying vec3, as above.
// 'ratioR,' et cetera, is the ratio of indices of refraction for
// the red, green and blue components respectively.
RedRefractionVector = refract(incidentVector, normalVector, ratioR);
GreenRefractionVector = refract(incidentVector, normalVector, ratioG);
BlueRefractionVector = refract(incidentVector, normalVector, ratioB);
// ...
}
Bu üç farklı vektör, basit örnekte renklerin nasıl karıştırıldığına benzer şekilde bir arada karıştırılabilen üç farklı küp haritası araması yapmak için kullanılabilir:
void main () {
vec3 color;
color.r = vec3(textureCube(EnvironmentMap, RedRefractionVector)).r;
color.g = vec3(textureCube(EnvironmentMap, GreenRefractionVector)).g;
color.b = vec3(textureCube(EnvironmentMap, BlueRefractionVector)).b;
gl_FragColor = vec4(color, 1.0);
}
Daha fazla ayrıntı için OpenGL Turuncu Kitabı mevcuttur ve temel yansıma ve kırılma etkilerinin bir örneğini ve ayrıca renk sapma etkisinin bir örneğini içerir.