Несколько источников света

Версия Minecraft
1.7.10
1,976
68
220
Доброго всем времени суток о/

Решил я малёх поизучать шейдеры, и наткнулся на интересную дилемму - как добавить в сцену с картой нормалей несколько источников света, используя так называемую "lightmap" - чёрную текстуру с белыми "пятнами"?
С одним источником сначала всё казалось просто, но только до тех пор, пока я не попробовал добавить второй (из этого, разумеется, ничего не вышло).
Делал я по сему туториалу, ну и вот что я имею на данный момент (для написания использовался Shader Edit for Andriod):
C-like:
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif

/** [last] finger pos */
uniform vec2 touch;
/** screen size */
uniform vec2 resolution;
/** noraml map */
uniform sampler2D norm;

void main() {
    float radius = 0.5;
    // normalized current pixel coords
    vec2 xy = gl_FragCoord.xy / resolution;
    // light source coords and radius
    vec3 light = vec3(touch.xy, radius);
    // image (texture) color
    vec4 color = vec4(1.0);
    // distance to the current pixel from the light position
    float dist = distance(gl_FragCoord.xy, light.xy);
    // normal vector to current "poly" from normal map
    vec3 NormalVector = texture2D(norm, xy).xyz;
    // light vector with 50 length
    vec3 LightVector = vec3(light.x - gl_FragCoord.x, light.y - gl_FragCoord.y, 50.0);
    // "rotating" normals
    NormalVector.x -= 0.5;
    NormalVector.y -= 0.5;
    // normalizing vectors
    NormalVector = normalize(NormalVector);
    LightVector = normalize(LightVector);
    // if in render distance (?)
    if(light.z * resolution.x > dist) {
        float diffuse = max(dot(NormalVector, LightVector), 0.0);
        float distanceFactor = (1.0 - dist / (light.z * resolution.x));
        gl_FragColor = color * diffuse * distanceFactor;
    } else gl_FragColor = vec4(0.0);
}

Кто знает, подскажите, пожалуйста, заранее благодарю
 

CumingSoon

Местный стендапер
1,634
12
269
Тебе нужен массив и цикл. Вкратце, проходишься вместо 1 источника по целому массиву. И поэтому: "vec3 light = vec3(touch.xy, radius);" должно быть заменено на нечто другое.
Сразу видно, что код для планшетов/смартфонов. Не знаю, как ты реализуешь это в майне, но хотел бы увидеть результаты.
 
Сверху