11 光照与着色之阴影计算

在计算机图形学中,阴影计算是重要的光照与着色方面。阴影不仅使场景更真实,还能强调物体的形状和深度。接下来,我们将探讨阴影计算的基本概念、常用技术以及实现案例。

阴影的类型

阴影主要分为两种类型:

  1. 硬阴影:边缘清晰,通常出现在光源强烈且投射物体与光源距离较近的情况下。
  2. 软阴影:边缘模糊,常见于大面积光源或有多个光源的场景。

我们将基于这两种阴影类型进行讨论。

阴影计算的基本原则

阴影计算依赖于以下几个步骤:

  1. 光源识别:确定场景中光源的位置和特性。
  2. 遮挡判断:判断一个点是否在某个物体的阴影中,即计算从光源到该点的视线是否被其他物体遮挡。
  3. 阴影强度计算:一旦判断出某个点处于阴影中,还需考虑其阴影的强度。

在进行遮挡判断时,最常用的方法是 射线投射深度图 方法。

射线投射法

射线投射法通过发射射线从光源到场景中的点来判断阴影。具体流程如下:

  1. 从光源发射射线:对每个表面点,发射一条射线指向光源。
  2. 交点检测:检查射线是否与其他物体相交。如果相交,则该表面点就在阴影中。
  3. 阴影的强度:根据物体之间的位置关系计算阴影的强度。

射线投射的示例代码

以下是使用射线投射法进行阴影计算的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Ray:
def __init__(self, origin, direction):
self.origin = origin
self.direction = direction

class Sphere:
def __init__(self, center, radius):
self.center = center
self.radius = radius

def intersect(self, ray):
# 计算光线与球体的交点
# 返回交点的距离或None
pass

def is_in_shadow(point, light_source, objects):
direction_to_light = light_source - point
ray = Ray(point, direction_to_light.normalized())

for obj in objects:
if obj.intersect(ray):
return True
return False

深度图法

深度图法(也称为阴影贴图)使用纹理来存储从光源视角到物体的深度信息。具体步骤如下:

  1. 场景渲染到深度图:使用光源的视角渲染场景,生成深度图。
  2. 场景渲染到屏幕:在常规视角下渲染场景,同时检查每个片段的深度与深度图中的对应深度进行比较。
  3. 阴影判定:如果屏幕点的深度大于深度图中的深度,则该点在阴影中。

深度图的实现思路

以下是生成阴影贴图的基本步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function render_to_shadow_map(light_source):
set_view(light_source)
clear_depth_buffer()
for each object in scene:
render_object_to_depth_buffer(object)
return depth_buffer

function render_scene_with_shadows(scene, depth_buffer, light_source):
for each pixel in image:
depth_at_pixel = get_depth_from_shadow_map(depth_buffer, pixel)
if current_depth > depth_at_pixel:
set_pixel_shadow_color()
else:
set_pixel_normal_color()

总结

阴影计算是光照与着色的重要组成部分,它通过多种方法模拟现实世界中光与物体的相互作用。在这一篇中,我们讨论了射线投射法与深度图法两种常见的阴影计算技术,并提供了基础代码示例。这为下一篇关于“着色算法”的文章打下了基础,因为阴影的计算结果会直接影响物体的着色效果。通过将光照、着色和阴影结合,我们可以更真实地表现计算机生成的场景。

11 光照与着色之阴影计算

https://zglg.work/computer-graph-zero/11/

作者

AI免费学习网(郭震)

发布于

2024-08-11

更新于

2024-08-12

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论