我第一次使用着色器在OpenGL中实现了基本的阴影映射,现在遇到了一些问题。在下面,您可以看到我渲染的场景的示例:
我要进行的阴影映射的过程是,我使用“视图矩阵”从光的角度以及用于正常渲染的投影和模型矩阵将场景渲染到帧缓冲区。
在第二遍中,我将上述MVP矩阵从光的角度发送到顶点着色器,该顶点着色器将位置转换为光空间。片段着色器进行透视划分,并将位置更改为纹理坐标。
这是我的顶点着色器,
#version 150 core
uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 MVPMatrix;
uniform mat4 lightMVP;
uniform float scale;
in vec3 in_Position;
in vec3 in_Normal;
in vec2 in_TexCoord;
smooth out vec3 pass_Normal;
smooth out vec3 pass_Position;
smooth out vec2 TexCoord;
smooth out vec4 lightspace_Position;
void main(void){
pass_Normal = NormalMatrix * in_Normal;
pass_Position = (ModelViewMatrix * vec4(scale * in_Position, 1.0)).xyz;
lightspace_Position = lightMVP * vec4(scale * in_Position, 1.0);
TexCoord = in_TexCoord;
gl_Position = MVPMatrix * vec4(scale * in_Position, 1.0);
}
还有我的片段着色器
#version 150 core
struct Light{
vec3 direction;
};
uniform Light light;
uniform sampler2D inSampler;
uniform sampler2D inShadowMap;
smooth in vec3 pass_Normal;
smooth in vec3 pass_Position;
smooth in vec2 TexCoord;
smooth in vec4 lightspace_Position;
out vec4 out_Color;
float CalcShadowFactor(vec4 lightspace_Position){
vec3 ProjectionCoords = lightspace_Position.xyz / lightspace_Position.w;
vec2 UVCoords;
UVCoords.x = 0.5 * ProjectionCoords.x + 0.5;
UVCoords.y = 0.5 * ProjectionCoords.y + 0.5;
float Depth = texture(inShadowMap, UVCoords).x;
if(Depth < (ProjectionCoords.z + 0.001)) return 0.5;
else return 1.0;
}
void main(void){
vec3 Normal = normalize(pass_Normal);
vec3 light_Direction = -normalize(light.direction);
vec3 camera_Direction = normalize(-pass_Position);
vec3 half_vector = normalize(camera_Direction + light_Direction);
float diffuse = max(0.2, dot(Normal, light_Direction));
vec3 temp_Color = diffuse * vec3(1.0);
float specular = max( 0.0, dot( Normal, half_vector) );
float shadowFactor = CalcShadowFactor(lightspace_Position);
if(diffuse != 0 && shadowFactor > 0.5){
float fspecular = pow(specular, 128.0);
temp_Color += fspecular;
}
out_Color = vec4(shadowFactor * texture(inSampler, TexCoord).xyz * temp_Color, 1.0);
}
问题之一是自阴影,如您在图片中看到的那样,板条箱自身有阴影。我尝试过的是启用多边形偏移(即glEnable(POLYGON_OFFSET_FILL),glPolygonOffset(GLfloat,GLfloat)),但是它并没有太大变化。如您在片段着色器中所看到的,我将静态偏移值设置为0.001,但我必须根据光的距离更改该值,以获得更理想的效果,这不是很方便。当我渲染到帧缓冲区时,我也尝试使用正面剔除,也没有太大变化。
另一个问题是“光”视锥台之外的像素会被着色。可以投射阴影的唯一对象是板条箱。我想我应该选择更合适的投影并查看矩阵,但是我不确定该怎么做。有哪些常见做法,我应该选择正交投影吗?
通过四处搜寻,我了解到这些问题并不那么琐碎。有没有人容易解决这些问题。您能给我一些其他提示吗?
请问我是否需要有关我的代码的更多信息。
这是有和没有阴影的板条箱特写的比较。自阴影更明显。