Bağlayıcı gölgelerin maliyeti önemsiz olmayabilir, ancak aynı gölgelendiricileri kullanan tüm nesneleri toplulaştırmadan binlerce öğe oluşturmazsanız, bu sizin darboğazınız olmayacaktır.
Bunun mobil cihazlar için geçerli olup olmadığından emin değilim, ancak koşul sabit ve üniforma arasındaysa GPU'lar şubelerle korkunç derecede yavaş değildir. Her ikisi de geçerli, her ikisi de geçmişte kullanılmış ve gelecekte kullanılmaya devam edecek, hangisinin sizin durumunuzda daha temiz olacağını düşündüğünüzü seçin.
Ayrıca, bunu gerçekleştirmenin birkaç yolu daha vardır: "Uber-gölgelendiriciler" ve OpenGL gölgelendirici programlarının bağlanma şekliyle ilgili biraz hile.
"Über gölgelendiriciler" esasen dallanma eksi olmak üzere ilk tercihtir, ancak birden fazla gölgelendiriciniz olacaktır. Bunun yerine kullanmanın if
- ifadelerini, sen önişlemci kullanmak #define
, #ifdef
, #else
, #endif
, ve uygun dahil olmak üzere farklı sürümleri, derlemek #define
gerekenler için s.
vec4 color;
#ifdef PER_VERTEX_COLOR
color = in_color;
#else
color = obj_color;
#endif
Ayrıca gölgelendiriciyi ayrı işlevlere bölebilirsiniz. Tüm işlevler için prototipleri tanımlayan ve çağıran bir gölgelendiriciye sahip olun, uygun uygulamaları içeren bir grup ekstra gölgelendiriciyi bağlayın. Tüm hileleri değiştirmek zorunda kalmadan tüm nesneler üzerinde filtrelemenin nasıl yapıldığını değiştirmeyi kolaylaştırmak için gölge eşleme için bu hileyi kullandım.
//ins, outs, uniforms
float getShadowCoefficient();
void main()
{
//shading stuff goes here
gl_FragColor = color * getShadowCoefficient();
}
Sonra, getShadowCoefficient()
gerekli üniformaları tanımlayan birden fazla gölgelendirici dosyam olabilir ve başka bir şey yoktu. Örneğin, aşağıdakileri shadow_none.glsl
içerir:
float getShadowCoefficient()
{
return 1;
}
Ve shadow_simple.glsl
içerir (CSM'leri uygulayan gölgelendiricimden basitleştirilmiş):
in vec4 eye_position;
uniform sampler2DShadow shad_tex;
uniform mat4 shad_mat;
float getShadowCoefficient()
{
vec4 shad_coord = shad_mat * eye_position;
return texture(shad_tex, shad_coord).x;
}
Ve sadece farklı bir shadow_*
gölgelendiriciyi bağlayarak gölgelendirmeyi isteyip istemediğinizi seçebilirsiniz . Bu çözüm çok daha fazla ek yüke sahip olabilir, ancak GLSL derleyicisinin bunu yapmanın diğer yollarına kıyasla ekstra ek yükü optimize edecek kadar iyi olduğunu düşünmek istiyorum. Bu konuda hiç test yapmadım, ama bunu yapmayı seviyorum.