<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>图形学 on JRQZ</title>
    <link>https://jrqz-wu.com/zh/categories/%E5%9B%BE%E5%BD%A2%E5%AD%A6/</link>
    <description>Recent content in 图形学 on JRQZ</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 27 Apr 2026 17:30:00 +0800</lastBuildDate>
    <atom:link href="https://jrqz-wu.com/zh/categories/%E5%9B%BE%E5%BD%A2%E5%AD%A6/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>KisekiEngine 点光源阴影排查：从单张透视 Shadow Map 到 6 面 Shadow Map Array</title>
      <link>https://jrqz-wu.com/zh/post/kisekiengine-point-light-shadow-array/</link>
      <pubDate>Mon, 27 Apr 2026 17:30:00 +0800</pubDate>
      <guid>https://jrqz-wu.com/zh/post/kisekiengine-point-light-shadow-array/</guid>
      <description>开源项目地址：https://github.com/sznswjr/kiseki_engine&#xA;相关提交：6b97d64 Refactor point light shadow mapping&#xA;背景 KisekiEngine 的 garden scene 里有房子、树、围栏、长椅、邮箱和地面。前一轮已经实现了基础 Blinn-Phong 光照、纹理、OBJ 加载和一张 2D shadow map。最初看起来阴影已经出现了，但继续观察就会发现两个问题：&#xA;围栏、立柱这类细长物体在地面上的阴影缺失或不完整。 改成点光源 cubemap 思路后，地面阴影又出现过位置错乱。 这两个现象很容易被误判成 bias、PCF 或 shadow map 分辨率问题。实际根因更底层：光源类型、shadow map 投影模型和 cubemap face 坐标约定没有匹配好。&#xA;这篇文章记录这次排查和重构过程。&#xA;问题一：围栏阴影为什么会缺失 最早的实现方式是：把 shadow camera 放在点光源位置，然后使用一张 2D 透视 shadow map。&#xA;这听起来合理，因为点光源确实有一个位置。但透视 shadow map 表达的是一个视锥，它天然适合 Spot Light，不适合完整的 Point Light。&#xA;点光源向所有方向发光。单张 2D shadow map 最多只能覆盖一个方向的锥形区域。为了让它“尽量覆盖当前场景所有物体”，只能不断扩大 FOV。&#xA;在这个场景里，点光源位于：&#xA;scene.light.position = {3.0f, 8.0f, 4.0f}; 围栏位于地面南侧：&#xA;addOBJObject(scene, fenceMesh, modelTexture, (simd_float3){i * 2.</description>
    </item>
    <item>
      <title>在 Metal 引擎中实现透视阴影贴图</title>
      <link>https://jrqz-wu.com/zh/post/metal-shadow-mapping/</link>
      <pubDate>Sat, 18 Apr 2026 15:00:00 +0800</pubDate>
      <guid>https://jrqz-wu.com/zh/post/metal-shadow-mapping/</guid>
      <description>前言 有光的地方就有影子。但如果你写过渲染引擎，就会知道——光照模型（比如 Blinn-Phong）默认是不会产生阴影的。它只告诉你&amp;quot;这个点被光照了多亮&amp;quot;，但不会告诉你&amp;quot;这个点有没有被别的东西挡住&amp;quot;。&#xA;KisekiEngine 之前已经实现了 Blinn-Phong 点光源光照，场景里有立方体、有地面、有光照明暗，但就是没有阴影。一个物体浮在地面上，下面却没有影子，看起来就像悬浮在空中一样不真实。&#xA;要加阴影，最经典的方案就是 Shadow Mapping（阴影贴图）。它的核心思想只需要一句话：&#xA;站在光源的位置看一眼，记下每个方向上最近的深度；然后在正常渲染时，把每个片元投影回光源视角，比较一下深度——如果片元比记录的深度更远，说明它被什么东西挡住了，那它就在阴影里。&#xA;接下来，我们一步一步把这个想法变成 Metal 代码。&#xA;整体架构：双 Pass 渲染 整个实现的核心是在同一个 Command Buffer 里做两个 Render Pass：&#xA;┌─────────────────────────────────────────────────┐ │ Command Buffer │ │ │ │ ┌─────────────────────┐ ┌──────────────────┐ │ │ │ Shadow Pass │ │ Main Pass │ │ │ │ │ │ │ │ │ │ 光源视角渲染深度 │──▶│ 正常渲染 + │ │ │ │ → Shadow Map │ │ 采样 Shadow Map │ │ │ │ (1024×1024) │ │ → 阴影判定 │ │ │ └─────────────────────┘ └──────────────────┘ │ └─────────────────────────────────────────────────┘ Pass 1（Shadow Pass）：把光源当成一台摄像机，用透视投影渲染整个场景，但只写深度，不输出颜色。结果存到一张 1024×1024 的深度纹理里，这就是 shadow map。 Pass 2（Main Pass）：用正常的摄像机渲染场景。在片段着色器里，把每个片元的世界坐标投影到光源空间，去 shadow map 里查一下深度，判断它是不是在阴影里。 下面按实现顺序逐步讲解。</description>
    </item>
  </channel>
</rss>
