3D渲染中的自阴影:让虚拟世界更真实

自阴影指物体自身部分遮挡光 线,导致其他部分产生阴影的现象(如手指间阴影)。在3D渲染中,自阴影通过阴影贴图技术实现:从光源视角生成深度贴图,主渲染时比较像素深度,若被自身其他部分遮挡(深度值更大)则判定为阴影。技术实现包含光源空间变换、深度比较等步骤,需注意精度误差导致的“阴影痘痘”,可通过bias偏移优化。自阴影能增强物体立体感,是实时渲染中提升真实感的关键技术之一。


一、什么是自阴影?

自阴影,就是一个物体自己把自己的某些部分挡住了光,导致这些部分处于阴影中。


二、形象比喻:用手电筒照自己的手

想象你晚上在房间里,拿着一个手电筒照自己的手。你的手指之间会出现阴影——这些阴影不是别的东西投下来的,而是你的手指自己把光挡住了,让手的某些部分变暗了。

  • 手指的正面:直接被手电筒照到,很亮。
  • 手指的侧面或背面:被其他手指挡住,光照不到,就变成了阴影。

这就是自阴影:一个物体的某些部分挡住了光,导致自己身上出现阴影。


三、在3D游戏里的自阴影

在3D游戏中,角色、建筑、树木等模型都不是一个平面,而是有很多凹凸、弯曲、细节的表面。比如:

  • 角色的胳膊挡住了自己的身体,身体上就有自阴影。
  • 一棵树的树枝挡住了树干,树干上就有自阴影。
  • 一座雕像的鼻子挡住了脸,脸上就有自阴影。

自阴影让物体看起来更立体、更真实,而不是像纸片一样平平的。


四、用“太阳照山”再举个例子

想象太阳升起,照在一座大山上。山的东坡被太阳照亮,山的西坡因为被山体自己挡住,处于阴影中。这也是自阴影——山自己把自己的一部分遮住了。


五、技术原理简述

在阴影贴图技术中,判断一个点是否在阴影里,就是看它是不是被“自己”或者“别的物体”挡住了。如果是自己挡住自己,那就是自阴影。


六、总结

  • 自阴影就是物体自己把自己的某些部分挡住了光,形成的阴影。
  • 生活中手指、山体、雕像等都能看到自阴影。
  • 自阴影让3D世界更真实、更有立体感。

下面用通俗易懂+技术细节的方式,解释自阴影在实时渲染(比如阴影贴图)中的技术实现原理。


1. 自阴影的本质

自阴影的本质是:

一个物体表面上的某个点,光线从光源出发到达这个点时,途中被这个物体自身的其他部分挡住了。

比如:

  • 角色的胳膊挡住了自己的身体,身体上就有自阴影。
  • 雕像的鼻子挡住了脸,脸上就有自阴影。

2. 阴影贴图中的自阴影实现原理

阴影贴图的基本流程

1. 从光源视角渲染场景,生成深度贴图(shadow map)

  • 记录每个像素距离光源最近的深度(即“谁最先被光照到”)。

2. 从摄像机视角渲染场景,判断每个像素是否在阴影中

  • 对于场景中每个像素,先把它的位置变换到光源视角下,查找它在阴影贴图中的深度值。
  • 如果当前点到光源的距离 > 阴影贴图里记录的最近距离(加上bias),说明它被挡住了(在阴影里);否则就是亮的。

自阴影的技术实现

  • 关键点:
    当你判断一个点是否在阴影里时,这个“挡住它”的物体,既可以是别的物体,也可以是它自己。
  • 自阴影的出现:
    如果一个点被自己身上的其他部分挡住(比如手指挡住手掌),那么在光源视角下,这个点的深度会比阴影贴图里记录的“最近深度”更大,于是被判定为在阴影中。

形象理解

  • 阴影贴图就像光源拍了一张“谁最先被我照到”的照片。
  • 你在主渲染时问:“我这个点能被光照到吗?”
    光源说:“你在我照片上不是最前面的那个,说明你被挡住了。”
    挡住你的,可能是你自己身上的别的部位。

3. 代码层面(GLSL伪代码)

// 1. 变换到光源空间
vec4 fragPosLightSpace = lightSpaceMatrix * vec4(fragPos, 1.0);

// 2. 归一化到[0,1]纹理坐标
vec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;
projCoords = projCoords * 0.5 + 0.5;

// 3. 采样阴影贴图
float closestDepth = texture(shadowMap, projCoords.xy).r;
float currentDepth = projCoords.z;

// 4. 判断是否在阴影中
float bias = ...; // 防止自阴影痘痘
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;

如果currentDepth比closestDepth大,说明有东西挡住了光,可能是自己,也可能是别的物体。


4. 自阴影常见问题

自阴影痘痘(Shadow Acne):

  • 由于浮点精度误差,物体表面自己把自己误判为“被挡住”,导致表面出现密密麻麻的阴影斑点。

解决方法:

  • 加bias(偏移量),让比较时更宽松。
  • 动态bias:根据表面法线和光线夹角调整偏移。

5. 总结

自阴影的技术实现,和普通阴影没有本质区别,都是通过“深度比较”自动判断出来的。

只要用阴影贴图,物体自己挡住自己时就会自然产生自阴影。

但要注意精度误差带来的“自阴影痘痘”,需要用bias等技术优化。


版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/148199053

最新文章