<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>The Only Problem&#39;s Blog</title>
    <link>https://congyuxiaoyoudao.github.io/</link>
    <description>Recent content on The Only Problem&#39;s Blog</description>
    <generator>Hugo -- 0.157.0</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 25 Sep 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://congyuxiaoyoudao.github.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>SLAM Biography I · Problem Formulation and Model Construction</title>
      <link>https://congyuxiaoyoudao.github.io/posts/slam-biography/problem-formulation-and-model-construction/</link>
      <pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/slam-biography/problem-formulation-and-model-construction/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;本文及其所属的专栏是笔者阅读学习高翔博士视觉 SLAM 十四讲的产物，看书跑代码总是匆匆而过，写点笔记加深印象。本来的打算是按书的节奏依次为每章做总结，但最后觉得这样效率太低且不够连贯，还是凭自己的思路写下去。观前提示，这一部分偏向理论，不可避免地文字会比较多&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 什么是 SLAM 问题&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; SLAM 问题的数学模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视觉 SLAM 十四讲视频课程：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV16t411g7FR&#34;&gt;【高翔】视觉SLAM十四讲&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;视觉 SLAM 十四讲配套代码仓库：







  
  &lt;a href=&#34;https://github.com/gaoxiang12/slambook2&#34;&gt;gaoxiang12/slambook2: edition 2 of the slambook&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;个人学习代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/learn-slambook2&#34;&gt;congyuxiaoyoudao/learn-slambook2: Learn Basic Knowledge on Visual SLAM: From Theory to Practice 2nd edition by Xiang Gao&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-何为-slam-what-is-slam&#34;&gt;0x01 何为 SLAM？ What is SLAM&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;认识任何一个事物或者技术总是可以从两个角度出发：它是什么以及它能做什么？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SLAM，全称为 Simultaneous Localization and Mapping，翻译过来就是同步定位与建图。它要求携带传感器的主体（例如运动机器人），在环境信息未知的情况下，通过自身在环境中的运动同步估计运动过程并建立环境的模型。这样来看，SLAM 的核心问题有二：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定位（Localization）：携带传感器的主体需要通过传感器感知环境信息判断自身的状态（位姿）；&lt;/li&gt;
&lt;li&gt;建图（Mapping）：主体基于自身连续轨迹上的观测数据，逐步建立环境地图；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，这两个问题间还有一个实时性的要求，即 Simultaneous（同步），同步地完成定位与建图，而非先进行信息采集再将数据传送回去做全局的估计和优化（那样耗时和局限就比较大，也就没意义了）。&lt;/p&gt;
&lt;p&gt;在 SLAM 问题中，传感器作为运动主体感知环境的唯一途径，承担了从环境中获取观测数据的作用。传感器的不同意味着观测数据不同，也将 SLAM 问题分为不同类别，常见的如以相机为主要传感器的视觉 SLAM（Visual SLAM）和以激光雷达为主要传感器的激光 SLAM（LiDAR SLAM）等。在视觉 SLAM 的背景下，SLAM 问题就变成了从一系列连续图像中估计相机位姿，并基于图像特征等信息构建环境地图的过程。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interlude 5. Poisson Reconstruction</title>
      <link>https://congyuxiaoyoudao.github.io/posts/interludes/poisson-reconstruction/</link>
      <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/interludes/poisson-reconstruction/</guid>
      <description>&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 泊松重建的一些前置数学知识&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 泊松重建算法原理及推导过程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺 







  
  &lt;a href=&#34;https://www.youtube.com/watch?v=nmvs0vrBT18&#34;&gt;Laplace&amp;rsquo;s Equation and Poisson&amp;rsquo;s Equation&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://www.zhihu.com/question/25481998&#34;&gt;如何通俗地理解拉普拉斯方程、泊松方程、亥姆霍兹方程？&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/107653198&#34;&gt;泊松表面重建详解&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📃 







  
  &lt;a href=&#34;https://hhoppe.com/poissonrecon.pdf&#34;&gt;Poisson Surface Reconstruction&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-隐函数表达-implicit-expression&#34;&gt;0x01 隐函数表达 Implicit Expression&lt;/h2&gt;
&lt;p&gt;表达一个三维曲面，例如球心位于原点、半径为 $r$ 的球面，可以使用球的标准方程：&lt;/p&gt;
&lt;div&gt;$$
F(x,y,z):x^{2}+y^{2}+z^{2}-r^{2}=0
$$&lt;/div&gt;
该方程（形如 $F(x,y,z)=0$）就定义了球面的隐函数表达，它将所有变量都放在等式一侧，隐含了因变量关于自变量的函数关系，在描述球面的情况下，$z$ 关于 $x,y$ 的关系可以显化为：
&lt;div&gt;$$
z=\sqrt{ r^{2}-x^{2}-y^{2} }
$$&lt;/div&gt;
这就是隐函数的一种显式表达，它描述球面在 $xOy$ 平面以上的部分。如果需要描述整个球面，还需要 $xOy$ 平面以下的部分：
&lt;div&gt;$$
z=-\sqrt{ r^{2}-x^{2}-y^{2} }
$$&lt;/div&gt;
也就是说显化的隐函数可能无法覆盖所有满足隐函数方程的解集，因为显函数是一一映射，而隐函数可能是一对多或者多对多的映射。
&lt;p&gt;在计算机图形学中，SDF 就是一种常用的可以描述表面的隐函数表达：&lt;/p&gt;
&lt;div&gt;$$
\phi(\mathbf{x})=\pm \text{dist}(\mathbf{x},\partial \Omega)
$$&lt;/div&gt;
SDF 以物体表面为界，空间中任意一点 $\mathbf{x}$ 的 SDF 函数值为与物体表面的带符号距离（物体内部为负、外部为正）。自然的，物体表面可以用 SDF 值为零的水平集描述：
&lt;div&gt;$$
\{\mathbf{x}\,|\,\phi(\mathbf{x})=0\}
$$&lt;/div&gt;
![使用 SDF 的零水平集描述表面，Jeong et.al](https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%205.PoissonRecon/202508201058142.png#center)
&lt;hr&gt;
&lt;h2 id=&#34;0x02-泊松方程-poisson-equation&#34;&gt;0x02 泊松方程 Poisson Equation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;泊松表面重建其实不需要对泊松方程有什么很深刻的数学物理了解，笔者也非相关专业，所以就仅凭自己的想法写一点更为直观的解释&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interlude 4. 在点云数据中估计法线</title>
      <link>https://congyuxiaoyoudao.github.io/posts/interludes/estimatenormals/</link>
      <pubDate>Wed, 02 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/interludes/estimatenormals/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;3DGS 的原论文中，每个高斯是不存法线信息的，然而后续工作中，也有研究人员将法线和 BRDF 信息进行训练，这样一来，就可以在后续的光栅化过程中输出 GBuffer，完成 relighting 的任务。生成初始法线，可以仅考虑高斯的均值，基于局部平面假设进行估计。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 什么是 PLY&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 利用最小二乘法估计点云法线&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 使用 PCL 的实现&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 在 CloudCompare 中实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://paulbourke.net/dataformats/ply/&#34;&gt;PLY - Polygon File Format&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://pointclouds.org/documentation/tutorials/normal_estimation.html&#34;&gt;Estimating Surface Normals in a PointCloud&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📺 







  
  &lt;a href=&#34;https://www.youtube.com/watch?v=lco0yFWm1QQ&#34;&gt;Normal and Curvature Calculation for a Pointcloud&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📃 







  
  &lt;a href=&#34;http://mediatum.ub.tum.de/doc/800632/941254.pdf&#34;&gt;http://mediatum.ub.tum.de/doc/800632/941254.pdf&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-ply-格式&#34;&gt;0x01 PLY 格式&lt;/h2&gt;
&lt;p&gt;PLY（Polygon File Format, also known as the Stanford Triangle Format），是一种用于存储多边形集合的图形对象的格式。有两种子格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASCII：ASCII 编码表示，直观易读&lt;/li&gt;
&lt;li&gt;Binary：二进制格式，存储空间小，能够快速保存和加载&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PLY 文件的经典结构如下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Header  // description field, containing element type, property and count
Vertex List  // list of data for each vertex
Face List  // list of data for each face
(List of other elements)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Header 描述文件格式，评论（comment）以及每个元素的描述，并在其后指定该元素属性。例如一个以 ASCII 子格式保存的 PLY 文件，其 Header 如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interlude 3. WebGPU From Scratch</title>
      <link>https://congyuxiaoyoudao.github.io/posts/interludes/webgpu-from-scratch/</link>
      <pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/interludes/webgpu-from-scratch/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;从导师那里听说了 WebGPU，做了点调查发现这个 API 还挺新的，正好之前只零零碎碎学了一点 OpenGL，相比于不适合人类学的 Vulkan，还是 WebGPU 显得友好一点。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x00-to-begin-with&#34;&gt;🚩 0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 什么是 WebGPU&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 配置 WebGPU 开发环境&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 第一个 WebGPU 项目：HelloTriangle！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🍪 







  
  &lt;a href=&#34;https://webgpu.github.io/webgpu-samples/&#34;&gt;WebGPU Samples&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://gpuweb.github.io/gpuweb/&#34;&gt;WebGPU API Spec&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://www.w3.org/TR/WGSL/&#34;&gt;WebGPU Shading Language&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📺 







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1uu411B7uq/&#34;&gt;WebGPU小白入门（一）：如何零基础创建第一个WebGPU项目！&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://codelabs.developers.google.com/your-first-webgpu-app?hl=zh-cn&amp;amp;authuser=0#0&#34;&gt;您的第一个 WebGPU 应用&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://lil-gui.georgealways.com/&#34;&gt;lil-gui 0.20.0&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-认识-webgpu&#34;&gt;0x01 认识 WebGPU&lt;/h2&gt;
&lt;p&gt;WebGPU 是一个由 W3C GPU 工作组制定的新的现代图形 API，用于在 Web 应用中访问 GPU 功能。&lt;/p&gt;
&lt;p&gt;在 WebGPU 出现之前，Web 端的图形编程应用主要采用 WebGL 和 WebGL 2，虽然它们有着跨平台能力和强大的社区支持，但架构过于古老，最新的 WebGL 2 只是封装了 2009 年 OpenGL 3.2 的实现。Khronos 也指出 WebGL 后续更新中不再引入现代 GPU 的新特性。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 8. GAMES202 Homework 5</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-5/</link>
      <pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-5/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;202 系列完结撒花 ✿✿ヽ(°▽°)ノ✿！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 部分课程内容回顾&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;







  
  &lt;a href=&#34;https://games-cn.org/forums/topic/zuoye5fabugonggao/&#34;&gt;作业5发布公告及场景下载&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/607012514&#34;&gt;GAMES202-作业5：实时光线追踪降噪&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-问题修复-troubleshooting&#34;&gt;0x01 问题修复 TroubleShooting&lt;/h2&gt;
&lt;p&gt;做作业时遇到一些出现问题的地方，这里一并提一下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;运行 build.bat 后 build 目录下没有出现可执行文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReadFloatImage&lt;/code&gt; 方法报错&lt;/li&gt;
&lt;li&gt;mathutil.h 中 &lt;code&gt;uint32_t&lt;/code&gt; was not declared in this scope&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一个问题纯属对 Cmake 不熟练，build.bat 提供的命令只是生成工程文件，要运行构建还需要如下命令（或者直接用 VS 等 IDE 运行）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;cmake --build build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里为了简化运行操作，新增了一个 run.bat：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;cmake --build build
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;Denoise.exe
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二个问题为路径错误，下载完场景后我的根目录文件结构如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 7. GAMES202 Homework 4</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-4/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-4/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;好久不见！最近在忙别的工作，这几天难得有时间，赶紧把 202 系列作业做个收尾ε٩(๑&amp;gt; ₃ &amp;lt;)۶з！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 部分课程内容回顾&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📃 







  
  &lt;a href=&#34;https://blog.selfshadow.com/publications/s2017-shading-course/imageworks/s2017_pbs_imageworks_slides_v2.pdf&#34;&gt;Revisiting Physically Based Shading at Imageworks&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-课程回顾-recap&#34;&gt;0x01 课程回顾 Recap&lt;/h2&gt;
&lt;h3 id=&#34;能量守恒的-bsdf-energy-preserving-bsdfs&#34;&gt;能量守恒的 BSDF Energy-Preserving BSDFs&lt;/h3&gt;
&lt;p&gt;Cook-Torrance 提出的微表面 BRDF 只考虑光线在表面经过一次弹射后出射到观察方向的能量，然而忽略了多次弹射最终出射到观察方向的能量，这就造成了能量损失。尤其是当材质的 roughness 较高时，G 项减小，多次弹射的比例增加，能量损失越严重。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Missing Energy of Microfacet BRDF, Revisiting Physically Based Shading at Imageworks, SIGGRAPH 2017&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%207.GAMES202HW4/202506151740381.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;2017 年 Kulla 和 Conty 受到 Disney Principle BRDF 的启发，提出了一种改进的方法，即通过引入一个能量补偿项，将多次弹射出射到观察方向的能量补充回来，就能近似地保持能量守恒。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 6. GAMES202 Homework 3</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-3/</link>
      <pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-3/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;HiZ 还在施工中……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 部分课程内容回顾&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-课程回顾-recap&#34;&gt;0x01 课程回顾 Recap&lt;/h2&gt;
&lt;p&gt;SSR（Screen Space Reflection）是一种基于屏幕空间的反射算法，也被应用于模拟全局光照。因为是屏幕空间的算法，不能且无需像传统全局光照算法那样需要获取场景的原始几何信息，而是只在当前相机的视野范围计算反射，所以效率相对较高，但也存在一些屏幕空间的 Artifacts。&lt;/p&gt;
&lt;p&gt;SSR 算法有两个假设：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;屏幕范围内的反射光，其反射源也同样来自屏幕空间的某个像素；&lt;/li&gt;
&lt;li&gt;所有被直接光照亮的物体（在屏幕空间中则表现为像素），都可以作为次级光源参与对反射的贡献；&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;SSR 对反射表面没有要求，即不仅能模拟镜面反射，还可以模拟各种粗糙度的反射&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;重用屏幕空间信息 GAMES202&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%206.GAMES202HW3/202505192155513.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;SSR 算法的步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对每个需要计算反射的像素沿反射方向发射一条光线；&lt;/li&gt;
&lt;li&gt;沿光线方向步进在屏幕空间中查找深度缓冲并与场景求交；&lt;/li&gt;
&lt;li&gt;若有交点，则将交点颜色作为反射颜色添加到原始像素上；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中最关键的步骤就是光线求交，最简单的方法就是 Linear RayMarching，光线每次行进一个固定的距离，每次行进后获取该位置的深度值再与场景深度进行比较，如果某次判断光线深度大于场景深度，则认为发生了相交。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;固定步长的光线步进 GAMES202&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%206.GAMES202HW3/202505192214607.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;当然这种方法的精细度很依赖光线步长，小的步长效果更好但消耗大，反之，更大的步长则可能导致光线“穿过”场景而误判相交，造成错误计算反射的情况。&lt;/p&gt;
&lt;p&gt;为了在提高精度的同时节省开销，研究人员又提出了一种动态步长的方法，即 Hierarchical ray trace。允许光线根据场景信息在行进期间选取不同的步长，例图中光线一开始至少可以以 7 倍的 gap 作为步长，之后再缩减到原始的步长。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;层级光线追踪 GAMES202&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%206.GAMES202HW3/202505192226586.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;说到实时渲染中的一些动态操作，几乎就离不开预处理。同样的，这种方法运行的前提是，光线需要知道行进的“最大安全距离”，即可以迈多大的步子而不与场景发生相交。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里最大安全距离是类比 SDF 的说法，或者应该说当前层级规定的步长&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一种实现它的方法是预先生成深度图的 Mip-Map，这里四个像素的最小值作为 Mip 生成的逻辑，具体原因涉及到比较的保号性：如果光线与上一级 Mip 都不相交（$D_{ray}&lt;D_{M_{i+1}}$），则其一定与下级不相交（$D_{ray}&lt;any_{4}\{D_{M_{i}}\}$ ）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 5. GAMES202 Homework 2</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-2/</link>
      <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;(∩^o^)⊃━☆ﾟ.*･｡&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 部分课程内容回顾&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📃







  
  &lt;a href=&#34;https://dl.acm.org/doi/10.1145/15886.15902&#34;&gt;The rendering equation | ACM SIGGRAPH Computer Graphics&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📃







  
  &lt;a href=&#34;https://dl.acm.org/doi/10.1145/566654.566612&#34;&gt;Precomputed radiance transfer for real-time rendering in dynamic, low-frequency lighting environments | ACM Transactions on Graphics&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-前置准备-warm-up&#34;&gt;0x01 前置准备 Warm Up&lt;/h2&gt;
&lt;h3 id=&#34;渲染方程-render-equation&#34;&gt;渲染方程 Render Equation&lt;/h3&gt;
&lt;p&gt;James T. Kajiya（没错就是那个提出 Kajiya-Kay 头发着色模型的 Kajiya）在 1986 年提出了渲染方程（The Render Equation），原论文里长这样：&lt;/p&gt;
&lt;div&gt;$$
I(x,x&#39;)=g(x,x&#39;)\left[ \epsilon(x,x&#39;)+\int_{S}\rho(x,x&#39;,x&#39;&#39;)I(x&#39;,x&#39;&#39;)dx&#39;&#39; \right]
$$&lt;/div&gt;
&lt;p&gt;当然现在看得更舒服的形式长这样：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 4. GAMES202 Homework 1</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-1/</link>
      <pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-1/</guid>
      <description>&lt;hr&gt;
&lt;h2 id=&#34;-0x00-to-begin-with&#34;&gt;🚩 0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺 B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦 代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-shadow-map&#34;&gt;0x01 Shadow Map&lt;/h2&gt;
&lt;p&gt;完成两个任务点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一个 Pass 以光源作为相机渲染一张 ShadowMap，需要为 Shader 传递正确的 &lt;code&gt;uLightMVP&lt;/code&gt; 矩阵；&lt;/li&gt;
&lt;li&gt;第二个 Pass 获取光源传递的统一变量 FBO （ShadowMap），需要比较当前 ShadingPoint 的深度值与 ShadowMap 上记录的深度值，得出可见性项与 Shading 结果相乘。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DirectionalLight.js 中，完善 &lt;code&gt;CalcLightMVP&lt;/code&gt; 函数：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%204.GAMES202HW1/202504151505787.png#center&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-glsl&#34; data-lang=&#34;glsl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;c1&#34;&gt;// Model transform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;mat4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;translate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;modelMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modelMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;translate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;mat4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;modelMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modelMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// View transform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;mat4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lookAt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;viewMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lightPos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;focalPoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lightUp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// Projection transform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.01&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;14&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// caution! Depth of far plane should be a bit more larger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;400&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;mat4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ortho&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;projectionMatrix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;远平面需设置得稍微大一点，避免光源的视锥范围无法覆盖全部场景&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 3. GAMES202 Homework 0</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-0/</link>
      <pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/games202-homework-0/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;开个新坑，之前囫囵吞枣地过了一遍 202，现在忘得差不多了，该捡起来。正好给枯燥的生活增添一点色彩（？），最近比较忙但还是争取一周做一个作业&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x00-to-begin-with&#34;&gt;🚩 0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; GAMES202 作业 0&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;不&lt;/strong&gt;包含作业框架分析&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📺 B 站视频：







  
  &lt;a href=&#34;https://www.bilibili.com/video/BV1YK4y1T7yY/?spm_id_from=333.337.top_right_bar_window_custom_collection.content.click&amp;amp;vd_source=b6584cebba3a7a1a34d2f60d63bdc868&#34;&gt;GAMES202-高质量实时渲染&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📦 代码仓库：







  
  &lt;a href=&#34;https://github.com/congyuxiaoyoudao/GAMES202_Homework/tree/working&#34;&gt;congyuxiaoyoudao/GAMES202_Homework at working&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;master 分支上是 202 全部作业汇总，working 分支用于提交代码。需要原始作业可下载 master 分支的包&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x01-configuration-环境配置&#34;&gt;⚙️ 0x01 Configuration 环境配置&lt;/h2&gt;
&lt;p&gt;选择使用 VSCode 插件搭建本地服务器，在扩展中搜索 Live Server，安装此插件。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%203.GAMES202HW0/202504072204421.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;在编辑 Html 代码窗口按 F1（或者右键）选择 &lt;strong&gt;Live Server: Open with Live Server&lt;/strong&gt;，随后会自动打开浏览器，导航至本地服务器端口，一切正常的话是下面这个效果：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Assignments/Assignment%203.GAMES202HW0/202504072210368.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以使用鼠标和右上角的控制面板进行一些简单的交互。&lt;/p&gt;
&lt;p&gt;如果遇到模型贴图加载不出来（只有 202 字样），可以选择多刷新几次。或者直接在加载脚本前预加载贴图，可以根治这个问题。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;preload&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;assets/mary/MC003_Kozakura_Mari.png&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;image/png&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;crossorigin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-0x02-blinn-phong-shading-model&#34;&gt;🤔 0x02 Blinn-Phong Shading Model&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;没什么好说的，CV 工程师&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;使用-glsl-编写-shader&#34;&gt;&lt;strong&gt;使用 GLSL 编写 Shader&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;如果使用字符串的方式引入 Shader，就在 InternalShader.js 中加上：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interlude 2. Manga Speed Lines</title>
      <link>https://congyuxiaoyoudao.github.io/posts/interludes/manga-speed-lines/</link>
      <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/interludes/manga-speed-lines/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;偶然用 shader 乱搓出的一个类似漫画风格的放射线效果，实际上还有很多缺陷，权且当思路分享了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x00-to-begin-with&#34;&gt;🚩 0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 漫画的速度线效果&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 基于 blender 着色器的乱糊&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x01-what-is-radiating-lines&#34;&gt;👀 0x01 What is Radiating Lines&lt;/h2&gt;
&lt;p&gt;漫画中经常有这种放射线的效果：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%202.MangaSpeedLines/202504021841792.jpg#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;通常是用来表达角色情绪、物体速度感或突出画面重点，动漫中还会做出动画以增加表现力。但是如果不靠画（全凭程序化）怎么做呢？&lt;/p&gt;
&lt;p&gt;如果不限制工具的话思路很简单，在 PS 里先画一个渐变，再用波浪扭成间隔不等的尖刺状，最后转成极坐标就完事了。&lt;/p&gt;
&lt;p&gt;但是如果要用 shader 写的话就有点头疼了，主要是那种不规则的尖刺效果。我一开始想的是让 V 的起点在径向随机偏移，但 UV 毕竟是重复平铺的，极坐标一扭还是会窜到中心去，甚至 V 有没有都没关系。&lt;/p&gt;
&lt;p&gt;所以偏移 UV 的想法是不行了，我的做法是糊出一个遮罩（也是很邪门了）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x02-radiating-lines-放射线效果&#34;&gt;🕸️ 0x02 Radiating Lines 放射线效果&lt;/h2&gt;
&lt;p&gt;要做出放射的效果，首先得让 UV 位于模型的中心，以正方形平面为例，在映射中将 UV 同时减去 0.5，让 UV (0,0) 处位于模型中心。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%202.MangaSpeedLines/202503312115356.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后就是让 U 绕圆周环游一圈，现在的 UV 可以当成直角坐标系处理，很容易给出一个单位圆的方程：&lt;/p&gt;
&lt;div&gt;$$
u^2+v^2=1
$$&lt;/div&gt;
&lt;p&gt;然后算以 U 轴正方向为起点的角度：&lt;/p&gt;
&lt;div&gt;$$
\theta=\arctan \frac{v}{u}
$$&lt;/div&gt;
&lt;p&gt;可以用运算节点的反正切 2 计算这个$\theta$，但是结果的范围是$-\pi \sim+\pi$，需要映射回$0 \sim1$：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 2. A Review of Realistic Water Waveform Simulation</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/a-review-of-realistic-water-waveform-simulation/</link>
      <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/a-review-of-realistic-water-waveform-simulation/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;本着虚心交流与接受批评的态度，把这篇用来“应付”学校作业的综述写作放上来，不吝赐教！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x00-to-begin-with&#34;&gt;0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 近年来水体波形模拟的主要方法分类介绍&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 现有文献的研究趋势分析及未来方向预测&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/95917609&#34;&gt;真实感水体渲染技术总结&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/672738842&#34;&gt;九、流体模拟简述&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;📖 







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/21573239&#34;&gt;游戏中的实时水体模拟技术&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0x01-摘要&#34;&gt;0x01 摘要&lt;/h2&gt;
&lt;p&gt;真实感水体模拟因其高度仿真的视觉表现与广泛的应用领域成为计算机图形学的研究热点。本文回顾了近 50 年（1978-2025）来水体模拟的方法，具体而言，包括早期基于经验与统计的方法与参数化波列合成的方法，中期基于物理的数值模拟方法和波粒子方法，以及近年转向数据驱动的深度学习方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键词&lt;/strong&gt;：流体模拟、波形模拟、深度学习、物理数值方法&lt;/p&gt;
&lt;p&gt;Realistic water simulation has emerged as a prominent research focus in computer graphics due to its highly realistic visual effects and broad application domains. This paper reviews the methods of water simulation over the past 50 years (1978–2025), specifically including early approaches based on empirical and statistical models, parametric wave synthesis methods, mid-term physics-based numerical simulation techniques and wave particle methods, as well as the recent shift toward data-driven deep learning approaches.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assignment 1. Analysis of WizMap Scalable Interactive Visualization</title>
      <link>https://congyuxiaoyoudao.github.io/posts/assignments/analysis-of-wizmap-scalable-interactive-visualization/</link>
      <pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/assignments/analysis-of-wizmap-scalable-interactive-visualization/</guid>
      <description>本文就原论文分析了交互式可视化工具 WizMap，探讨其如何通过创新的多尺度摘要技术解决大规模机器学习嵌入的可视化和解释难题，并介绍了其用户界面、应用场景及未来发展。</description>
    </item>
    <item>
      <title>Interlude 1. ToonIntergratedBxDF</title>
      <link>https://congyuxiaoyoudao.github.io/posts/interludes/toon-intergrated-bxdf/</link>
      <pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/posts/interludes/toon-intergrated-bxdf/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;之前的几篇文章中，我们已经完成了Toon模型一些基本的Feature。在深入定制之前，我们必须冷静下来思考一下我们需要什么&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x00-to-begin-with&#34;&gt;🚩 0x00 To begin with&lt;/h2&gt;
&lt;p&gt;这篇文章将会包含以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 集成卡渲着色模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For reference&lt;/strong&gt;👇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📖







  
  &lt;a href=&#34;https://zhuanlan.zhihu.com/p/690066418&#34;&gt;【UE5】通过深度偏移计算刘海投影&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-0x02--toonintergratebxdf&#34;&gt;👀 0x02  ToonIntergrateBxDF&lt;/h2&gt;
&lt;p&gt;目前我们的光照模型只是已经具备了基本的明暗处理，仍然有数量众多的Feature需要去实现（Ramp、SDF、Anisotropic hair、Matcap、眼透等等）。虽然有一小部分可以用一些trick附加在基础色或其它材质槽上，但其余的就无可奈何了。而且不同于Unlit，在底层逻辑写死的情况下，能在材质编辑器中做的工作就比较有限了。&lt;/p&gt;
&lt;p&gt;一个比较容易想到的方法就是为需要特殊处理的材质单独新建一个着色模型，比如说头发一个、皮肤一个，然后里面各自处理需要的Feature。但着色模型数量是有限的，在不扩展&lt;code&gt;FMaterialShadingModelField&lt;/code&gt;至&lt;code&gt;uint32&lt;/code&gt;的情况下最多只允许16个着色模型。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ShadingModelField只有16位&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503111821380.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;而且这么多模型逐一添加也比较繁琐，我认为不太优雅，所以想到另一个方法。既然我们已经有一个&lt;code&gt;ToonBxDF&lt;/code&gt;，何不仿照&lt;code&gt;IntegrateBxDF&lt;/code&gt;的写法，在里面写个大分支，分发不同Toon材质的情况呢？&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503111821796.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;思路有了，那下一个问题就是，根据什么分发呢？&lt;code&gt;IntegrateBxDF&lt;/code&gt;是根据&lt;code&gt;ShadingModelID&lt;/code&gt;，我们应该也需要一个&lt;code&gt;ToonShadingModelID&lt;/code&gt;。这个时候我想起了之前开辟但没使用过的ToonCustom引脚。现在它被存储在GBuffer的&lt;code&gt;CustomData&lt;/code&gt;的Alpha通道中，我们可以停止放置Play，好好使用它了。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CustomData的存储&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503111821429.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FGBufferData&lt;/code&gt;中的&lt;code&gt;CustomData&lt;/code&gt;在BasePass中经过编码来到GBufferD，最后输出到MRT[4]或MRT[5]。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503111928061.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;类型是&lt;code&gt;float&lt;/code&gt;，（没错，&lt;code&gt;half4&lt;/code&gt;竟然是个宏）。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503111822563.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;但是范围只有0~1，由于GBufferTexture的性质，我们在这个引脚输入的任何数值都会被硬件钳制到这个范围。没办法，写个函数转一下吧。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;将浮点转为ToonShadingModelID&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503112000369.png#center&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-hlsl&#34; data-lang=&#34;hlsl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;uint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DecodeFloatToToonShadingModelID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SrcFloat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SrcFloat&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UE里面也新写一个材质函数，把正常的ID映射过去，&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;MF_EncodeToonShadingModelIDToFloat&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503112007292.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;编码后接入自定义引脚&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503112010055.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;最后在ToonIntergrateBxDF里随便写点东西测试一下，只有当&lt;code&gt;ToonShadingModelID&lt;/code&gt;为0时才有光照计算。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503112012801.png#center&#34;&gt;&lt;/p&gt;
&lt;p&gt;单独把身体的ID设成2看看效果。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/TA-interludes/Interlude%201.ToonIntegrateBxDF/202503112017053.png#center&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://congyuxiaoyoudao.github.io/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/about/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Sakurakouji Luna&#34; loading=&#34;lazy&#34; src=&#34;https://raw.gitmirror.com/congyuxiaoyoudao/Picgo-ImageBed/main/Wives/202505260010872.jpg&#34;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;我喜欢仰望月亮。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;每每沐浴那宛若来自神明的清辉，流动的静谧，澄澈的涤荡，便能够宽赦种种浮躁、不安与愤懑。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;——隐忍之心。含蓄典雅。闲寂幽静。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;平日的生活倒也算称意，辰时而作，子时而息，忙碌于课业的闲暇也有时间钻研自己的兴趣。这般日子确乎不惊波澜，我也默许。&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;然而心底总潜藏着对近月之仪的向往，渴望捧起其矜持之下为人所漠视的——无声的冷焰。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nebula</title>
      <link>https://congyuxiaoyoudao.github.io/nebula/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://congyuxiaoyoudao.github.io/nebula/</guid>
      <description></description>
    </item>
  </channel>
</rss>
