Genel bir özet:
Kalkan olmadan sahnenizin derinlik haritasını oluşturun . Saydam nesneler genellikle daha sonraki bir geçişte işlendiğinden, bunu etkili bir şekilde ücretsiz olarak alabilirsiniz. Aksi takdirde, sahne sans kalkanını bir derinlik gölgelendirici ile bir RTT'ye oluşturarak derinlik haritasını oluşturabilirsiniz .
Sahnenizi normal şekilde oluşturun, derinlik haritasını kalkan gölgelendiricinize iletin.
Gölgelendiricide, sahne derinliğindeki farkı kalkan parçasının derinliğinden hesaplayın ve bu farkı parça rengini değiştirmek için kullanın.
gösteri
Bunun basit bir WebGL demosunu yazdım.
Satır satır
Parça gölgelendirici kodunu ayrıntılı olarak inceleyelim:
float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;
Her parçadaki derinlik haritasını örnekleyin. Parçanızı ekran boşluğundan [0, genişlik / yükseklik] normalleştirilmiş [0.0, 1.0] koordinatlarına dönüştürmek için görüntü alanı boyutlarınıza bölmeyi unutmayın. Bu noktada, parça rengini örneklenen derinlik eşlemesi pikseline ayarladığınızda, şöyle görünür:
Derinlik haritası gri tonlama olduğundan, değeri herhangi bir kanaldan alabilirsiniz ( r
burada kullandım ).
float solidsDiff = 1.0 - smoothstep(
zNear,
zFar,
gl_FragCoord.z / gl_FragCoord.w
) - solidsDepth;
Ardından, sahne derinliği ile kalkan parçasının derinliği arasındaki farkı bulmak için bu derinlik örneğini kullanabilirsiniz. Derinliğinizi de normalleştirmeyi, [zNear, zFar] 'dan (kameranızın yakın ve uzak düzlemleri) [0.0, 1.0]' a götürmeyi unutmayın. smoothstep
bunu güzel yapar. Bu 1.0 -
değer solidsDiff
, fark maksimum (zFar - zNear) olduğunda 1,0 ve minimumda (0,0) 0,0 olacak şekilde ters çevrilmektir.
solidsDepth
Derinlik haritasını oluşturan derinlik gölgelendiricisinde zaten normalleştirilmiş olduğumu varsayıyorum .
float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));
Ardından, derinlik farkına bağlı olarak kalkanınızın alfa kanalını değiştirebilirsiniz. Burada minimum alfadan başlıyoruz 0.3
, sonra alfaya yakın bir farkla keskin bir artış sağlıyoruz0.0
.
- 0.005
Sadece "kavşak" kalın yapmak için beyaz marjı ekler ofset. Değiştirmeyi deneyin!
gl_FragColor = vec4(vec3(1.0), alpha);
Ve son olarak, bu alfa parça renginize uygulayın.
geliştirmeleri
Kavisli bir kalkan yapabilir, "enerji kalkanı" görünümü (demo) için plazma ekleyebilir veya sadece kavşakları (demo) gösteren efektleri keşfedebilirsiniz .
Gökyüzü Ekran kartınız sınırdır!