Если вы не хотите иметь дело с проблемами сортировки, я думаю, вы можете сделать это с помощью шейдера. Но каждый объект должен быть либо затронут тенью, либо нет. Таким образом, высокие деревья могут быть отмечены как не получение тени, в то время как земля, трава и персонажи будут получать тень.
Сначала сделайте буфер рамки с прозрачным белым цветом. Нарисуйте все свои тени на нем как чистый черный.
Затем создайте шейдерный шейдер, чтобы нарисовать все в своем мире. Это зависит от того, что вам не нужны все четыре канала цвета спрайта, потому что нам нужен один из этих каналов, чтобы отмечать каждый спрайт как получение тени или нет. Например, если вы не используете RGB для оттенка ваших спрайтов, мы можем использовать R-канал. Или, если вы не угасание их и, мы могли бы использовать А. Я буду считать последний здесь:
Vertex шейдеров:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
varying vec2 v_texCoords;
varying vec2 v_texCoordsShadowmap;
varying vec4 v_color;
uniform mat4 u_projTrans;
void main()
{
v_texCoords = a_texCoord0;
v_color = a_color;
v_color.a = v_color.a * (255.0/254.0); //this is a correction due to color float precision (see SpriteBatch's default shader)
vec3 screenPosition = u_projTrans * a_position;
v_texCoordsShadowmap = (screenPosition.xy * 0.5) + 0.5;
gl_Position = screenPosition;
}
Фрагмент шейдеры:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoords;
varying vec2 v_texCoordsShadowmap;
varying vec4 v_color;
uniform sampler2D u_texture;
uniform sampler2D u_textureShadowmap;
void main()
{
vec4 textureColor = texture2D(u_texture, v_texCoords);
float shadowColor = texture2D(u_textureShadowmap, v_texCoordsShadowmap).r;
shadowColor = mix(shadowColor, 1.0, v_color.a);
textureColor.rgb *= shadowColor * v_color.rgb;
gl_FragColor = textureColor;
}
Они полностью непроверены и, вероятно, имеют ошибки. Убедитесь, что цветная текстура буфера назначена «u_textureShadowmap». И для всех ваших спрайтов установите альфа-версию своего цвета, исходя из того, сколько тени вы хотите, чтобы они наносили на них, что обычно будет 0 или 0,1 (в зависимости от яркости, которую вы использовали раньше).
Я уже некоторое время искал что-то подобное. Я нашел небольшую полезную информацию, и методы, которые я нашел, были слишком тяжелыми для использования. – tobloef