- 1,976
- 68
- 220
Доброго всем времени суток о/
Решил я малёх поизучать шейдеры, и наткнулся на интересную дилемму - как добавить в сцену с картой нормалей несколько источников света, используя так называемую "lightmap" - чёрную текстуру с белыми "пятнами"?
С одним источником сначала всё казалось просто, но только до тех пор, пока я не попробовал добавить второй (из этого, разумеется, ничего не вышло).
Делал я по сему туториалу, ну и вот что я имею на данный момент (для написания использовался Shader Edit for Andriod):
Кто знает, подскажите, пожалуйста, заранее благодарю
Решил я малёх поизучать шейдеры, и наткнулся на интересную дилемму - как добавить в сцену с картой нормалей несколько источников света, используя так называемую "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);
}
Кто знает, подскажите, пожалуйста, заранее благодарю