Opengl(WebGL)前向渲染中的基本光照(包括多光源)

Demo:http://www.artvily.com/sample?sample=lightBase

Demo:http://www.artvily.com/sample?sample=lightGroup

如果打开报错,请清理一下缓存。

上面两张图分别为固定的简单光源和任意组织的多光源(lightGroup: 环境光, 平行光,点光源,聚光灯, 以及BlinnPhong光源)

本系统中的 GLSL Shader Code都是可以自动组装并且和mesh以及material等系统高度协作的。在我前面若干实例都使用这个渲染系统。欢迎爱好引擎架构的朋友一起交流探讨。

下面这段GLSL代码(上图多光源的fragment shader)就是自动生成的:

precision mediump float;
uniform sampler2D u_sampler0;
uniform vec3 u_lights[23];
varying vec3 v_vs;
varying vec2 v_uvs;
varying vec3 v_nvs;
varying vec3 v_camPos;
void main(){
vec3 lgColor3 = vec3(0.0);
vec3 tv3;
float f;
float f1;
vec3 t1v3;
lgColor3 += u_lights[0];
tv3 = u_lights[2] - v_vs;
f1 = length(tv3);
f = length(tv3 - u_lights[3] * tv3) / (f1 + 0.001);
f = max(f, u_lights[4].z);
f = 1.0 - min(f - u_lights[4].z,0.2)/0.2;
f1 = 1.0 - min(f1 / u_lights[4].x, 1.0);
tv3 = normalize(tv3);
lgColor3 += u_lights[1] * f * max(dot(tv3, v_nvs), 0.0) * f1;
tv3 = u_lights[6] - v_vs;
f = length(tv3);
f = 1.0 - min(f / u_lights[7].x, 1.0);
f = pow(f, u_lights[7].y);
tv3 = normalize(tv3);
lgColor3 += u_lights[5] * max(dot(tv3, v_nvs), 0.0) * f;
t1v3 = normalize(v_camPos - v_vs);
t1v3 = normalize(tv3 - t1v3);
lgColor3 += u_lights[8].x * pow(max(dot(v_nvs, t1v3), 0.0), u_lights[8].y) * f;
f = max(dot(u_lights[10], v_nvs), 0.0);
tv3 = normalize(v_camPos - v_vs);
tv3 = normalize(u_lights[10] - tv3);
lgColor3 += u_lights[11].x * pow(max(dot(v_nvs, tv3), 0.0), u_lights[11].y);
lgColor3 += u_lights[9] * f;
lgColor3 += max(dot(u_lights[13], v_nvs), 0.0) * u_lights[12];
tv3 = u_lights[15] - v_vs;
f = length(tv3);
f = 1.0 - min(f / u_lights[16].x, 1.0);
f = pow(f, u_lights[16].y);
tv3 = normalize(tv3);
lgColor3 += u_lights[14] * max(dot(tv3, v_nvs), 0.0) * f;
tv3 = u_lights[18] - v_vs;
f = length(tv3);
f = 1.0 - min(f / u_lights[19].x, 1.0);
f = pow(f, u_lights[19].y);
tv3 = normalize(tv3);
lgColor3 += u_lights[17] * max(dot(tv3, v_nvs), 0.0) * f;
tv3 = u_lights[21] - v_vs;
f = length(tv3);
f = 1.0 - min(f / u_lights[22].x, 1.0);
f = pow(f, u_lights[22].y);
tv3 = normalize(tv3);
lgColor3 += u_lights[20] * max(dot(tv3, v_nvs), 0.0) * f;
gl_FragColor = vec4(texture2D(u_sampler0, v_uvs).rgb * lgColor3, 1.0);
}

猜你喜欢

转载自blog.csdn.net/vily_lei/article/details/82763053