Renk sapmalarını nasıl uygularsınız?


22

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?


Neden kromatik abberation uygulamak istiyorsunuz?
ashes999

3
Çiçeklenme elde edildiği gibi devam edebilirsin. Normal sahnenizi 3 bulanık versiyonu ile birleştirmelisiniz; Bu üç dokudan her biri 3 temel renkte ağırlıklı olarak renklendirilmelidir. Tabi ki, 3 doku için farklı bulanıklaştırma stratejileri kullanırsanız varyasyonlar mümkündür (örneğin, farklı açısal ofsetlerle yön bulanıklığı hile yapabilir).
teodron

3
@ ashes999 - Gerçekçilik dokunuş eklemek için belki bir keskin nişancı kapsamı veya diğer uzun lens? Kromatik sapma, birçok bileşik lens tasarımının bir eseridir.
KeithS

Ayrıca, oyunun izlenmekte olduğu bir objektifin neden olduğu sapmaları gidermek için renk sapmaları uygulamak isteyebilirsiniz. Örneğin, Oculus Rift ile oynanan bir oyunda görüşün kenarlarında renk sapmaları olması iyi bir fikirdir.
Joseph Mansfield

Yanıtlar:


22

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.


Yalnızca bir doku örneği kullanan ve sadece renk veren bir yaklaşım var mı? Işın izleme gibi uygulamalar için çok faydalı olacaktır, üçe karşı bir ışının izlenmesi çok pahalıdır.
Tara,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.