ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Godot DirectionalLight2D 完全指南:平行光、日光月光模拟与 2D 阴影裁剪

Godot DirectionalLight2D 完全指南:平行光、日光月光模拟与 2D 阴影裁剪 文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载DirectionalLight2D 是 Godot 中模拟太阳光、月光的核心 2D 光照节点它以覆盖全场景的无限平行光线为特征光源位置不影响光照结果只有旋转角度决定光线的方向。本文将以 Godot 官方文档classes/class_directionallight2d.rst为骨架结合 2D 光照与阴影教程、Light2D 基类文档 及 CanvasItem 着色器参考系统讲解该节点的光照方向语义、height 与 max_distance 两个专属属性、继承自 Light2D 的通用光照/阴影参数以及在实际 2D 场景横版平台游戏、俯视角游戏中的完整配置流程。读完你将能够独立搭建一套带法线贴图与软阴影的 2D 日光照明系统并理解其底层渲染原理。DirectionalLight2D 是什么DirectionalLight2D 是一种 Light2D 节点它模拟的是来自无穷远处的无限平行光线覆盖整个 2D 场景。这类光适用于强度高、距离场景极远的照明源——最典型的用途就是模拟太阳光或月光。其完整继承链为DirectionalLight2D → Light2D → Node2D → CanvasItem → Node → Object与同属 Light2D 子类的 PointLight2D点光源/位置光不同方向光的特征在于光线彼此平行如同太阳或月亮距离受光面无穷远节点位置被忽略只有旋转basis决定光线方向因此在场景中移动 DirectionalLight2D 节点不会改变光照效果旋转它才会。光照方向语义Y 轴与全局基官方文档明确规定了方向光的发射语义光线沿节点全局基global basis的Y 方向发射。对于未旋转的光源这意味着光线向下发射。节点的位置被忽略只有基用于确定光的方向。这是 2D 光照方向与 3D 的一个关键差异。在 Godot 2D 坐标系中Y 轴向下为正因此默认不旋转的 DirectionalLight2D 发出向下的光适合天光从画面顶部照向地面的常规场景通过rotation_degrees或rotation调整节点角度即可让光线从任意斜向照射——例如清晨低角度斜光或傍晚另一侧斜光只需要旋转 DirectionalLight2D 节点即可无需移动它。从底层实现看RenderingServer 中通过枚举CANVAS_LIGHT_MODE_DIRECTIONAL 1标记 2D 方向光sun/moon light并在 CanvasItem 着色器中通过内置变量区分方向光与点光LIGHT_POSITION对 DirectionalLight2D 恒为(0.0, 0.0, 0.0)而LIGHT_IS_DIRECTIONAL为true详见 canvas_item_shader.rst。这意味着在自定义 2D 着色器里可以依据LIGHT_IS_DIRECTIONAL分支编写专属于方向光的着色逻辑。专属属性详解DirectionalLight2D 在 Light2D 基类之上只新增了两个专属属性height高度默认0.0用于2D 法线贴图normal mapping的光源虚拟高度取值范围从0与受光面平行到1与受光面垂直。默认值0.0表示光线与表面完全平行此时若使用法线贴图光照几乎不可见——因此官方建议在启用法线贴图后适当增大 height例如 0.51.0 之间的数值并在启用法线贴图后略微提升 Energy 以补偿观感上的变暗。需要特别强调的是height 只影响法线贴图表面的视觉表现不影响阴影的外观详见 2D 光照教程。这与法线贴图的工作原理一致——法线贴图以逐像素方式记录表面朝向光源高度决定入射角从而改变光照强度分布。对应的 setter/getter 为set_height(value)/get_height()该对方法实际继承自 Light2D 基类见 class_light2d.rst在 PointLight2D 与 DirectionalLight2D 上共用。max_distance最大距离默认10000.0物体与摄像机中心的距离超过该值以像素计时其阴影会被裁剪cull。减小此值可以防止摄像机视野之外的物体投射阴影同时提升渲染性能。需要注意Camera2D.zoom不会被max_distance考虑在内这意味着缩放zoom越大阴影会显得越早淡出。理解这一点对制作镜头缩放的横版游戏尤为重要如果场景中的物体在远摄视角下阴影异常消失优先检查 max_distance 与当前 Camera2D 的 zoom 组合。在实战中max_distance 是方向光性能调优的核心旋钮之一方向光阴影作用于整幅场景若不裁剪远处物体的阴影渲染负担会显著增加。配合将场景边界外的 LightOccluder2D 排除在外可获得明显的性能收益。继承自 Light2D 的通用属性DirectionalLight2D 与 PointLight2D 共享 Light2D 基类提供的光照与阴影参数完整列表见 Light2D 属性表在 Inspector 中表现为以下项目属性默认值说明Enabledtrue是否发光。与隐藏节点不同禁用此属性不会隐藏光的子节点Editor Onlyfalse仅在编辑器内可见运行时自动禁用便于编辑辅助ColorColor(1, 1, 1, 1)光颜色可做日出/日落的暖色、月光冷色等艺术化处理Energy1.0强度倍率越大越亮Blend Mode0(Add)混合模式BLEND_MODE_ADD0加法默认最常用、BLEND_MODE_SUB1减法负光用于特效、BLEND_MODE_MIX2线性插值混合Range Z Min / Z Max-1024/1024受光物体的 z 索引范围Range Layer Min / Max0/0受光物体的视觉层范围Range Item Cull Mask1控制哪些节点接收光照依据对方 CanvasItem 的 light_maskShadow Enabledfalse是否投射阴影Shadow ColorColor(0,0,0,0)阴影颜色alpha 控制阴影着色程度默认纯黑Shadow Filter0(None)阴影过滤SHADOW_FILTER_NONE0硬边最快、SHADOW_FILTER_PCF515 采样 PCF、SHADOW_FILTER_PCF13213 采样最软但最慢Shadow Filter Smooth0.0仅在 Filter 为 PCF5/PCF13 时生效值越高阴影越软但可能产生可见的带状伪影Shadow Item Cull Mask1控制哪些 LightOccluder2D投射阴影关键差异光照剔除掩码light cull mask对 DirectionalLight2D 无效但阴影剔除掩码shadow cull mask有效。DirectionalLight2D 会无条件照亮所有 2D 节点无论对方的 CanvasItem.light_mask 设置为何值。因此想用某些物体不被方向光照亮的方式做分层/混合是行不通的想让某些遮挡物不投射方向光阴影则可以在方向光的Shadow Item Cull Mask与遮挡物的Occluder Light Mask上做位掩码匹配详见 class_light2d.rst 的 Note 说明。这一行为也体现在 Inspector 中方向光的 Range Item Cull Mask 在运行时会被忽略。实战搭建一套日光/月光照明以下是官方教程推荐的完整 2D 照明节点组合2D 光照与阴影教程CanvasModulate—— 设置场景基础环境色代表没有任何 2D 光照射区域最终的照明颜色。没有它2D 光只会叠加在原本全亮的画面之上最终场景过亮。DirectionalLight2D—— 太阳光或月光。PointLight2D—— 火炬、篝火、弹丸等局部光源可选用。LightOccluder2D—— 定义阴影投射体可独立放置也可作为 TileMapLayer 的一部分。接收光照的普通 2D 节点Sprite2D、TileMapLayer 等。创建方向光并开启阴影的步骤在场景中新建DirectionalLight2D节点调整rotation如 45°获得斜向日光或保持 0° 获得垂直向下光在 Inspector 中设置Shadow Enabled为true为需要投射阴影的 Sprite2D 创建LightOccluder2D选中 Sprite2D点击 2D 编辑器顶部的Sprite2D菜单选择Create LightOccluder2D Sibling自动生成若轮廓不贴合可调整对话框中的Grow (pixels)/Shrink (pixels)后点击Update Preview反复校正详见 阴影设置章节。也可以手动新建 LightOccluder2D用 2D 编辑器顶部的 按钮绘制遮挡多边形。启用阴影后若没有视觉差异原因几乎总是场景中还没有任何遮挡体occluder。阴影必须以 LightOccluder2D 的遮挡多边形为投射基础。注意背景颜色不接收任何光照。若想让光照作用于背景需要为背景添加可视表示如 Sprite2D并使用其Region属性配合Texture Repeat Enabled制作平铺背景。阴影外观调优硬阴影Shadow Filter 保持None渲染最快适合像素风块状视觉软阴影设为PCF5可获得柔和阴影PCF13更软但渲染开销最高官方建议全场景同时使用的数量要克制Filter Smooth控制 PCF5/PCF13 下的软化程度过高会出现带状条纹伪影尤其 PCF5Shadow Color的 alpha 通道控制阴影着色强度可做艺术化调整。已知限制方向光阴影永远表现为无限长无论 height 属性如何设置——这是 Godot 2D 光照阴影渲染方法本身的局限教程原文。若需要有限长的方向光阴影官方给出的方案是关闭 DirectionalLight2D 的阴影改用自定义着色器读取由场景中 LightOccluder2D 自动生成的2D 有向距离场signed distance field, SDF。像素风游戏的阴影像素化Godot 在视口像素分辨率上计算 2D 光照与阴影而非源纹理的 texel 分辨率因此最近邻纹理过滤并不会让光照/阴影变成像素风。要实现与像素美术风格匹配的块状光照阴影需在 CanvasItem 着色器中把LIGHT_VERTEX与SHADOW_VERTEX对齐到像素网格示例见 2D 光照教程shader_type canvas_item; uniform float pixel_size 4.0; void fragment() { // 将光照与阴影对齐到像素网格。 LIGHT_VERTEX.xy floor(LIGHT_VERTEX.xy / pixel_size) * pixel_size; SHADOW_VERTEX floor(SHADOW_VERTEX / pixel_size) * pixel_size; // 正常渲染。 COLOR texture(TEXTURE, UV); }其原理是先用pixel_size除以坐标转换到网格空间再用floor()向下取整到最近网格点最后乘回以还原到屏幕空间从而强制引擎从离散网格位置采样光照。法线贴图与 specular 贴图下的方向光DirectionalLight2D 与 PointLight2D 均支持法线贴图与高光specular贴图二者可赋予任意继承 Node2D 或 Control 的 2D 元素。配置方式是在 Sprite2D 等节点的纹理属性上创建CanvasTexture资源然后分别指定Diffuse Texture基础颜色纹理Normal Map Texture法线贴图从高度图生成可用 Laigter 等工具辅助制作Specular Texture高光贴图控制每个像素的反射强度通常为灰度图Specular Color高光反射的颜色倍率Specular Shininess高光指数值越低反射越亮越弥散越高越集中适合潮湿表面。启用法线贴图后方向光看起来会明显变弱——此时应提高 DirectionalLight2D 的 Height 属性默认 0.0 与表面平行几乎不出效果并可小幅提升Energy来接近启用法线贴图前的观感官方说明。性能与工程建议max_distance 是最重要的方向光性能开关场景较大时将其从默认的10000.0调低到与摄像机视野匹配的数值可裁剪视野外物体的阴影投射方向光阴影在整幅视口内计算若画面中有大量遮挡物优先使用Shadow Item Cull Mask与遮挡物 Occluder Light Mask 的位掩码组合将不必要的投射体排除对于短生命周期动态特效子弹、爆炸可以用加法混合的 Sprite2D替代真正的 2D 光以换取性能无需进入单独渲染管线也支持 AnimatedSprite2D 动画化但要注意其混合公式不够精确、不能投射阴影、忽略法线贴图与高光贴图这三项代价官方对比在自定义着色器中区分方向光LIGHT_IS_DIRECTIONAL为true且LIGHT_POSITION恒为(0,0,0)据此可编写全局方向光专用的光照响应逻辑。参考资源DirectionalLight2D 类文档本文主体2D 光照与阴影完整教程含点光、阴影设置、法线贴图、像素化技巧Light2D 基类文档共享属性、BlendMode 与 ShadowFilter 枚举CanvasItem 类文档light_mask、z_index 等接收光照相关属性CanvasItem 着色器参考LIGHT_IS_DIRECTIONAL、LIGHT_POSITION 等内置光照变量RenderingServer 文档CANVAS_LIGHT_MODE_DIRECTIONAL 底层枚举赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐Argo CD 差异计算策略深度解析Legacy 与 Server-Side Diff 的实现原理与实战配置Argo CD 差异计算策略深度解析Legacy 与 Server Side Diff 的实现原理与实战配置 Argo CD 通过对比「期望状态Git 仓库示例工程Godot 4 AreaLight3D 面光源完全指南属性、软阴影、纹理光照与性能优化Godot 4 AreaLight3D 面光源完全指南属性、软阴影、纹理光照与性能优化 AreaLight3D 是 Godot 引擎中一种从二维矩形平面发射光文档教程游戏开发OpenMontage 的 Three.js 光照完全指南光源类型、阴影系统与环境光照实战OpenMontage 的 Three.js 光照完全指南光源类型、阴影系统与环境光照实战 本篇技术指南以 .agents/skills/threejs li人工智能AI Agent音视频媒体生成工作流自动化上一篇Humanizer 的 IDateOnlyHumanizeStrategy 接口定制 DateOnly.Humanize 相对日期策略的完整指南下一篇5分钟打造你的专属Obsidian知识管理中心从空白到高效工作流的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表