影子可以让人判断距离,比如物理世界1.3中,没有影子就让我以为物体还要飞一会儿,然后成功地判断失误了…
其实实现原理很简单,就是把物体按照光方向拍成2维的,然后绘制在平面上就行了,只要用到一个有点复杂的公式(详见《OpenGL ES 3.x游戏开发(下卷)》P126 )
shadow.vert
#version 320 es
precision mediump float;
layout(location=0)in vec3 a_position;
layout(location=1)in vec4 a_color;
layout(location=2)in vec3 a_normal;
layout(location=3)in vec3 a_texCoord;
out vec4 v_color;
out vec3 v_normal;
out vec3 v_texCoord;
out vec3 v_position;
uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;
uniform bool u_enableShadow;
uniform vec3 u_lightdirection;
void main()
{
if(u_enableShadow)
{
vec3 A = vec3(0.0,1.0,0.0);
vec3 N = vec3(0.0,1.0,0.0);
vec3 S = a_position - (100.0 * normalize(u_lightdirection));
vec3 V = vec3(u_model * vec4(a_position,1.0));
vec3 VL = S + (V - S) * (dot(N,(A - S)) / dot(N,(V - S)));
gl_Position = u_projection * u_view * vec4(VL,1.0);
}
else
{
gl_Position = u_projection * u_view * u_model * vec4(a_position,1.0);
}
v_color = a_color;
v_normal = normalize(vec3(u_model * vec4(a_normal,0.0)));
v_texCoord = a_texCoord;
v_position = normalize(vec3(u_model * vec4(a_position,0.0)));
}
lighting.frag
#version 320 es
precision mediump float;
in vec3 v_position;
in vec4 v_color;
in vec3 v_normal;
in vec3 v_texCoord;
out vec4 o_color;
uniform vec3 u_lightdirection;
uniform vec3 u_cameraposition;
uniform sampler2D sampler;
uniform bool u_enableTexture;
uniform vec4 u_color;
uniform bool u_enableShadow;
void main()
{
if(u_enableShadow)
{
o_color = vec4(0.1,0.1,0.1,1.0);
}
else
{
vec3 lightdirection = normalize(u_lightdirection);
float ambient = 0.5;
float diffuse = max(dot(v_normal,-lightdirection),0.0);
vec3 reflectdirection = normalize(reflect(lightdirection,v_normal));
vec3 viewdirection = normalize(u_cameraposition - v_position);
float specular = pow(max(dot(viewdirection,reflectdirection),0.0),32.0);
vec4 color = vec4(0.0,0.0,0.0,0.0);
if(u_enableTexture)
{
color = texture(sampler,vec2(v_texCoord));
}
else
{
color = u_color;
}
o_color = (ambient + diffuse + specular) * color;
}
}
效果图


![[Java] [OpenGL ES 3.2] 平面阴影 [Java] [OpenGL ES 3.2] 平面阴影](http://www.mshxw.com/aiimages/31/746568.png)
