<?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>图形学 on 榎aaaa的个人主页</title><link>https://jiat-t.github.io/graphics/</link><description>Recent content in 图形学 on 榎aaaa的个人主页</description><image><title>榎aaaa的个人主页</title><url>https://jiat-t.github.io/images/avatar.jpg</url><link>https://jiat-t.github.io/images/avatar.jpg</link></image><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 25 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jiat-t.github.io/graphics/index.xml" rel="self" type="application/rss+xml"/><item><title>Rendering Paths</title><link>https://jiat-t.github.io/graphics/rendering-paths/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://jiat-t.github.io/graphics/rendering-paths/</guid><description>&lt;h2 id="前向渲染forward-rendering"&gt;前向渲染（Forward Rendering）&lt;/h2&gt;
&lt;p&gt;前向渲染走的就是&lt;strong&gt;传统的光栅化渲染管线&lt;/strong&gt;：&lt;u&gt;应用阶段 -&amp;gt; 几何阶段 -&amp;gt; 光栅化阶段 -&amp;gt; 像素处理阶段&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;也就是说，对于每一个物体，都需要对每一个光源进行一次计算，伪代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 1. 几何阶段：顶点着色器处理物体的顶点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vertexShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;primitive&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 2. 光栅化：把三角形打散成一个个像素点（Fragments）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fragments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rasterize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primitive&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fragments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 初始化最终的像素颜色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;float4&lt;/span&gt; &lt;span class="n"&gt;finalColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ambient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 3. 核心：前向渲染会对每个片段遍历所有光源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;finalColor&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pixelShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 4. 逐片段操作：深度测试与写入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depthTest&lt;/span&gt; &lt;span class="n"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writeToColorBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalColor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writeToDepthBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;28&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;29&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;discard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 深度测试失败，丢弃
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;30&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;31&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;32&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;33&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;好处&lt;/strong&gt;：天然支持 MSAA 以及透明物体的渲染，不需要额外的 Pass 或者 G-Buffer，节省带宽&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从伪代码中就可以看出，如果场景中&lt;strong&gt;存在大量光源与大量物体&lt;/strong&gt;，循环就会被执行非常多次，其复杂度为 &lt;strong&gt;O(n * m)&lt;/strong&gt;，其中 n 是物体数量，m 是光源数量&lt;/li&gt;
&lt;li&gt;由于深度测试位于片元着色器之后，所以可能会产生非常严重的 &lt;strong&gt;OverDraw&lt;/strong&gt;，即一个像素被绘制多次，这在 pixelShader 的计算量偏大的情况下（比如 &lt;strong&gt;BSDF&lt;/strong&gt; 的计算）是不可接受的——产生了非常严重的&lt;strong&gt;性能浪费&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="延迟渲染deferred-rendering"&gt;延迟渲染（Deferred Rendering）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心思想是：****&lt;u&gt;先确定可见性，再进行光照计算&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>辐射度量学</title><link>https://jiat-t.github.io/graphics/%E8%BE%90%E5%B0%84%E5%BA%A6%E9%87%8F%E5%AD%A6/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://jiat-t.github.io/graphics/%E8%BE%90%E5%B0%84%E5%BA%A6%E9%87%8F%E5%AD%A6/</guid><description>整理辐射度量学中的 Radiant Energy、Radiant Flux、Radiant Intensity、Irradiance 和 Radiance。</description></item><item><title>Split-Sum IBL</title><link>https://jiat-t.github.io/graphics/split-sum-ibl/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0800</pubDate><guid>https://jiat-t.github.io/graphics/split-sum-ibl/</guid><description>整理 PBR IBL 中 Irradiance Map、Prefiltered Environment Map 与 BRDF LUT 的拆分思路和运行时组合方式。</description></item><item><title>PBR 材质模型</title><link>https://jiat-t.github.io/graphics/pbr-models/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0800</pubDate><guid>https://jiat-t.github.io/graphics/pbr-models/</guid><description>对比 PBR 中 Metallic-Roughness 与 Specular-Glossiness 两种材质工作流的贴图结构、能量守恒约束和显存开销。</description></item><item><title>GAMES104：大气与云的渲染</title><link>https://jiat-t.github.io/graphics/games104-atmosphere-and-clouds/</link><pubDate>Sun, 14 Jun 2026 10:28:47 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games104-atmosphere-and-clouds/</guid><description>记录高度场地形、三角形与四叉树细分的基本思路，以及地形 LOD 和层级管理问题。</description></item><item><title>GAMES104：渲染实践</title><link>https://jiat-t.github.io/graphics/games104-rendering-practice/</link><pubDate>Tue, 09 Jun 2026 10:32:42 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games104-rendering-practice/</guid><description>整理 GPU 执行架构、渲染资源组织、可见性裁剪、纹理压缩与 Cluster/Nanite 模型管线。</description></item><item><title>Pathtracer 梳理</title><link>https://jiat-t.github.io/graphics/pathtracer-code-notes/</link><pubDate>Tue, 02 Jun 2026 06:16:19 +0000</pubDate><guid>https://jiat-t.github.io/graphics/pathtracer-code-notes/</guid><description>按路径追踪、几何与 BVH、材质接口、PBR 和 IBL/MIS 梳理个人渲染器的代码职责与工程优化。</description></item><item><title>CPU 路径追踪器项目细节</title><link>https://jiat-t.github.io/graphics/pathtracer-project-details/</link><pubDate>Tue, 26 May 2026 05:46:15 +0000</pubDate><guid>https://jiat-t.github.io/graphics/pathtracer-project-details/</guid><description>整理个人 CPU 路径追踪器的模块分工、PBR 与 IBL、MIS 采样及 BVH 和多线程性能优化。</description></item><item><title>GAMES101 作业 5：基础光线追踪</title><link>https://jiat-t.github.io/graphics/games101-assignment-5/</link><pubDate>Thu, 26 Mar 2026 07:38:19 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games101-assignment-5/</guid><description>整理从像素坐标生成相机光线的空间变换流程，以及三角形求交的基础实现。</description></item><item><title>GAMES104：如何构建游戏世界</title><link>https://jiat-t.github.io/graphics/games104-game-world/</link><pubDate>Thu, 26 Mar 2026 01:08:36 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games104-game-world/</guid><description>整理 Game Object 与组件化、Tick 更新、事件交互和场景空间管理的基本思路。</description></item><item><title>GAMES104：引擎架构分层</title><link>https://jiat-t.github.io/graphics/games104-engine-architecture/</link><pubDate>Wed, 25 Mar 2026 07:55:05 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games104-engine-architecture/</guid><description>记录资源层、功能层、核心层、平台层与工具层的职责，以及引擎分层和依赖方向。</description></item><item><title>GAMES101 作业 4：Bézier 曲线</title><link>https://jiat-t.github.io/graphics/games101-assignment-4/</link><pubDate>Sun, 22 Mar 2026 06:46:41 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games101-assignment-4/</guid><description>记录 De Casteljau 递归插值绘制 Bézier 曲线的方法，以及采样步长与曲线绘制代码。</description></item><item><title>GAMES101 作业 2：三角形光栅化</title><link>https://jiat-t.github.io/graphics/games101-assignment-2/</link><pubDate>Thu, 19 Mar 2026 06:55:49 +0000</pubDate><guid>https://jiat-t.github.io/graphics/games101-assignment-2/</guid><description>记录三角形内部判断、包围盒遍历、重心坐标与深度测试的光栅化实现。</description></item></channel></rss>