自阴影指物体自身部分遮挡光 线,导致其他部分产生阴影的现象(如手指间阴影)。在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





