classRay: def__init__(self, origin, direction): self.origin = origin self.direction = direction
classSphere: def__init__(self, center, radius): self.center = center self.radius = radius defintersect(self, ray): # 计算光线与球体的交点 # 返回交点的距离或None pass
defis_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): returnTrue returnFalse
深度图法
深度图法(也称为阴影贴图)使用纹理来存储从光源视角到物体的深度信息。具体步骤如下:
场景渲染到深度图:使用光源的视角渲染场景,生成深度图。
场景渲染到屏幕:在常规视角下渲染场景,同时检查每个片段的深度与深度图中的对应深度进行比较。
阴影判定:如果屏幕点的深度大于深度图中的深度,则该点在阴影中。
深度图的实现思路
以下是生成阴影贴图的基本步骤:
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()