在看separable-sss的shader的时候,关注了一下其中点光源生成shadowmap的投影矩阵的处理,方法来自于Linearized Depth using Vertex Shaders,生成[0, 1]的线性深度。这也让我意识到,对于z在管线每一步的计算中,什么时候是线性的,什么时候变得不线性,我并没有掌握所有细节。

1
2
3
4
5
6
7
8
9
10
/**
* This is for rendering linear values:
* Check this: http://www.mvps.org/directx/articles/linear_z/linearz.htm
*/
D3DXMATRIX linearProjection = projection;
float Q = projection._33;
float N = -projection._43 / projection._33;
float F = -N * Q / (1 - Q);
linearProjection._33 /= F;
linearProjection._43 /= F;

阅读全文 »

以前记录的旧文档,先简单整理一下,免得遗失

jitter sample

sample
1
View.ViewMatrices.HackAddTemporalAAProjectionJitter(FVector2D(SampleX * 2.0f / View.ViewRect.Width(), SampleY * -2.0f / View.ViewRect.Height()));
阅读全文 »

2026年, 又是夏天。 还记得小时候的暑假, 醒来时的午后, 蝉鸣,也不显得聒噪, 时间温润的大手, 抚过我的记忆, 那是人生至享的时刻。 那时候, 父母也还年轻, 青山绿水,天总是很蓝, 我挥动竹竿, 追逐满天的蜻蜓, 我以为拥有了整个夏天。

本文基于AI生成步骤和具体实践整理。

步骤一:下载Command Line Tools

  1. 打开 https://developer.android.com/studio?hl=zh-cn#command-line-tools-only,下载 Windows 版的 command line tools 压缩包(名字类似 commandlinetools-win-xxxxxxx_latest.zip)。

  2. 在某个目录创建 SDK 根文件夹,比如 C:\android-sdk

  3. 解压压缩包,你会得到一个 cmdline-tools 文件夹,里面有 binlib 等。注意:需要再套一层 latest,最终目录结构必须是这样:

阅读全文 »

之前在Bufferless rendering in OpenGL提到使用一个三角形渲染全屏的方法,没想到此处犹有后续。使用包含全屏范围的三角形和scissor test,实现一个三角形渲染全屏的效率,比两个三角形组合成一个全屏quad的方法更高效。

Optimizing Triangles for a Full-screen Pass

What’s the best way to draw a fullscreen quad in OpenGL 3.2

阅读全文 »

记录一下渲染子进程中的截帧工具的使用,记录原因是,一开始并不顺利。目标程序是一个launcher进程,然后需要截帧的是子进程,渲染时OpenGL的,话说几个月前,通过RenderDoc的Capture Child Processes配置是成功截取过的,但是这次失效了,连同Nsight Graphics也遇到了问题。经过一些摸索,最终在两个工具中都能顺利截帧,在此记录一下。

RenderDoc

RenderDoc设置Capture Child Processes,但是启动子进程一直失败,先是尝试使用File>Attach to runing Instance未奏效,然后尝试进程注入。

阅读全文 »

不太会画各种流程图,但是有时候又不得不画一个糙图交差。之前倒是用过puml,但是想用一个又简单又能立即显示的工具,简单找了一下文本生成流程图的做法,第一种markdown中写mermaid最为简单直观;第二种\(\LaTeX\)TikZ,很重型了,但是排版起来会很好看。

Mermaid

Mermaid 是一个用纯文本生成图表的 JavaScript 库。通过mermaid语法描述图的结构和关系,它就能自动渲染成流程图、时序图、甘特图等可视化图表,不需要手动拖拽画图。

阅读全文 »

GLSL-PathTracer

1
2
3
4
5
6
7
8
9
10
11
12
float scale = tan(camera.fov * 0.5);
d.y *= resolution.y / resolution.x * scale;
d.x *= scale;
vec3 rayDir = normalize(d.x * camera.right + d.y * camera.up + camera.forward);

vec3 focalPoint = camera.focalDist * rayDir;
float cam_r1 = rand() * TWO_PI;
float cam_r2 = rand() * camera.aperture;
vec3 randomAperturePos = (cos(cam_r1) * camera.right + sin(cam_r1) * camera.up) * sqrt(cam_r2);
vec3 finalRayDir = normalize(focalPoint - randomAperturePos);

Ray ray = Ray(camera.position + randomAperturePos, finalRayDir);

刚开始看这段代码的时候,没有想清楚代码里预设的内容,也即成像平面的距离是1;这里面注意两个地方,成像平面(的距离,z方向的位移)上的点来确定光线的方向,以及对焦距离确定对焦点。

阅读全文 »
0%
×