LLM 与 Agent 研究

近期网站要更新备案,刚好借此机会重新捡起搁置许久的博客。

更新一下今年的一些工作,今年的主要工作是学习 LLM 与 Agent 的使用。

在前两年的工作里,我落后了当前的 AI 时代一段时间,感觉到自己的效率被熟练使用 AI 的人碾压。特别是第一次看到余弦姐姐 Github@cos 用了半天时间就搓完了一个生产可用的高斯渲染网站的时候,感觉到非常震撼。虽然当时对 AI 提高效率有一定的了解,但是真正第一次看到的时候还是很震撼。

从今年开始,我也开始涉及 LLM 辅助研发的工作,并且开始进入自动研发管线的领域,做了不少的学习和研究。

后续我将会在本网站和新的 LLM 专题博客 @lingkoi.tech(备案中) 中更新我的最新研究和许多 LLM 妙用技巧。

Vulkan Tutorial, but Ricardo2001zg!

前言

1
It has taken a lot of work to get to this point, but now you finally have a good base for a Vulkan program. The knowledge of the basic principles of Vulkan that you now possess should be sufficient to start exploring more of the features

—— 节选自 Vulkan Tutorial - Multisampling 。

从六月份起的引擎面试结束,我又回归了校园生活,并计划从《Vulkan Tutorial》开始,在自己的引擎旅途上启航。

经历了四个半月断断续续的学习,终于根据示例代码指导,完整地实现了教程里面的模型渲染展示,在此特向在数月里给予指导、支持和鼓励的 饼叔(微博@杨林)、董大师、晶晶 与 Meta@Homomniverse 社群等的各位前辈表示感谢,并在此进行一些简要分享。

所有实践代码均发布于 Github/Ricardo2001zg/DongTianEngine, 截至至本文时的 commit 版本为 281bd76 。

本文首发于 影疏弦断 - Vulkan Tutorial, but Ricardo2001zg!,开放转载授权,转载与使用请保留出处。

技术背景与导读

在开始学习这个教程的时候,我的渲染水平基本为

  1. DX11龙书中文版 简要阅读过;
  2. GAMES101 已经学习 Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping);
  3. 阅读过《3D游戏编程大师技巧》的上册,对渲染流程有基础了解;
  4. 没有学习过 GAMES104。

学习该教程的过程中,深刻体会了该教程的冗长与繁杂,但是全流程概述确实如此。对此,我建议阅读该教程的读者,可以自行对教程的每一章节进行拆分与原理思考,降低学习难度。同时建议与其他图形 API 教程进行交叉阅读,并以 GAMES 101 和 104 作为学习辅助。

该教程以 Vulkan API 的实用教学为主,没有过多涉及渲染原理,仅适用于已有图形渲染基础的读者,同时建议有操作系统的相关基础后再进行学习。过早阅读可能会导致读者在如朋友圈等社交空间的间歇性发病 :D

特别提醒:绘制三角形需要近千行代码,占据该教程约三分之一的阅读量,请耐心学习。

教程总览

该教程以基础的三角形绘制出发,讲解了从物理设备设置到渲染管线基础设置的全流程。并在三角形绘制完成后进行各类缓冲区的设置教学,并以模型加载、纹理映射、多级渐进纹理(Mipmaps)、多重采样等功能的实现作为教程进阶,完成一个模型基于 Vulkan 的基本绘制。

全教程的示例代码量约在 2000 行,其中,绘制三角形的基础代码量为 1000 行,该教程需要大量耐心与少量渲染基础,用于理解 Vulkan 中的大量功能设置。

对于教程内需要的 着色器、模型文件、纹理贴图 等数据文件,教程内均有提供,请仔细阅读教程。

分部导读

分部导读 1 - 基础设置

基础设置部分主要位于 Drawing a triangle 章节的 Setup 部分与 Presentation 部分。

Setup 部分主要进行的工作是 项目环境、验证层、物理与逻辑设备配置。项目环境直接参考教程内推荐即可。验证层、物理与逻辑设备配置 均以 Vulkan 内的 C++ 调用而实现。强烈建议完成验证层设置 用于调试与排错。

物理与逻辑配置均仅完成基础功能,教程后续将会进行陆续填充,填充时根据功能完善代码,建议填充时详细了解 特定选项 对应的 渲染阶段的特定功能 与 物理或逻辑设备提供的特性。

Presentation 部分主要进行的工作是基于 GLFW 库的桌面软件框架配置,用于呈现所位置图像。

分部导读 2 - 渲染管线

Drawing a triangle 章节的 Graphics pipeline basics 部分主要进行的工作是渲染管线设置,**强烈建议经常性翻阅 Introduction 中的简要概述图片(simplified overview)**。该流程图片展示了渲染管线的基础工作流程,有助于理解各类选项的用法。

同时特别提醒,Fixed functions 章节的填充内容略多于其他章节,可酌情分块阅读,并理解各结构体的填充含义。

分部导读 3 - 绘制与呈现

Drawing 与 Swap chain recreation 部分完成的是具体的绘制功能与呈现。

其中,在 Drawing 部分中会涉及帧缓冲区(Frame Buffer)与命令缓冲区(Command Buffer)的设置,其他缓冲区的设置将在后续章节中涉及。

除 Drawing 部分外的其余部分,基本以帧的呈现为主,将绘制画面显示在屏幕上。

自此,读者已有在窗口上绘制单个三角形并进行渐变着色的能力。

简要提醒:三角形的重绘默认不限速,可能在笔记本类设备上会大幅度提高核显使用率,可不必担心是否成功调用独立显卡。验证是否使用独立显卡可通过 在主循环中添加等待时间 或 输出物理设备的名称(通过 physicalDevice 查询) 两种方法。

分部导读 4 - 缓冲区实现

本章导读横跨 Vertex buffers、Uniform buffers 等多个缓冲区部分。包括 Frame Buffer 与 Command Buffer 在内,该教程指导了 帧、命令、顶点、统一、深度 等五类缓冲区的实现,并指导读者在具体渲染操作中使用上述缓冲区。以上缓冲区的实现章节中,均包含了各类缓冲区的优化手段,例如顶点缓冲区中的索引缓冲区等,读者可自行深入了解。

分部导读 5 - 模型与纹理

该导读涉及后续所有章节,最终完成了一个模型包含贴图在内的基础渲染。

Loading models 部分完成了一个 Obj 模型的读取,并将指定贴图映射到模型上。该部分是本教程所指导的最终渲染结果,后续仅包含部分优化。

Mipmap 部分为多级渐进纹理的特性开发,实现了贴图的多级渐进。

Multisampling 部分是教程的最后一章,本章涉及到了硬件特性使用,基于硬件所提供的特性,实现了多重采样功能。

分部导读 6 - 尾声

自此,读者掌握的 Vulkan 基本原理应该足以开始探索更多功能。

1
原文: The knowledge of the basic principles of Vulkan that you now possess should be sufficient to start exploring more of the features

后记

虽然完成了该教程的学习,但我认为我的计算机图形学基础仍然有待完善,渲染的基础原理还是掌握得较为不熟练,准备再花费一点时间巩固。

但是,经历了 Vulkan Tutorial 的学习,至少可以说是在图形学的门槛边上,完成了一次眺望。接下来我可能还会去学习 GAMES104 的课程,完成从 2000 行代码到 20000 行代码的飞跃,希望这篇简短的文章能够给教程的其他读者给予一些帮助。

再次感谢学习路上的各位前辈给予的帮助与鼓励。

Arch Linux for RicsLaptop

前言

经过了漫长的考虑和选择过程,终于决定把主力 Linux 环境从 Debian 迁移到 Arch Linux 上了。

系统环境

目标环境:

版本 Arch Linux (Lastest version)

软件环境

驱动环境

Nvidia Driver

Intel Graphic Driver

桌面环境

KDE(Wayland)

开发环境

VS Code

Github Desktop

Python

Flutter

Java JDK

Android SDK

Jetbrains (IDEA, PyCharm, DataGrip)

Vulkan

cmake

clang

g++

工具环境(常用)

7zip

Krita

Blender

WPS Office

Feishu

工具环境(性能优化)

Optick

RenderDoc

Intel VTune

NVIDIA Nsight Systems

NVIDIA Nsight Graphic

日常环境

Chrome

VLC

游戏环境

Steam

安装流程

最小化安装

此处参考 ArchLinux Wiki 中的 Installation guide (简体中文)。

后续安装

ArchLinux Wiki 太详细了,抄都不用抄了,对着装就行。

基本上就是 NVIDIA 专有驱动 -> KDE -> Chrome -> 看着 Wiki 和本列表装其他软件。

整了个记录脚本出来,请不要真的执行它。

Downloads: ricslaptop_install.sh

更新 2022-10-23 08:52:32

经过一段时间的测试,现在可以正式执行多系统跨平台开发的庞大计划。系统整体基于 Arch Linux,并搭载 qemu/kvm 虚拟机,对 Windows、Linux、MacOS 进行虚拟化模拟。(MacOS 虚拟化具有潜在法律问题,本文仅供学习使用,请勿用于生产环境)

[x]TODO: 1. Intel 9560 passthrough

参考资料:PCI_passthrough_via_OVMF_(简体中文)

[x]TODO: 2. Host virtual network

参考资料:Linux虚拟网络设备之bridge(桥)

[x]TODO: 3. Host SSH and NetWork Settings

[x]TODO: 4. Win11Work Settings

[x]TODO: 5. WinServer2022 Router(NAT)

设置完 NAT 服务以后记得设置 DNS 服务器,不然配置出来的网络也是挂的。

参考资料: 事件 407 和 408 在 DNS 服务器事件日志中报告

无法连接套接字 警告可忽略,Linux端的网桥配置好网关即可(KDE 的 network manager 设置网关通过设置 ip route 生效)

[x]TODO: 6. OSX-KVM

[ ]TODO: 7. NVIDIA passthrough

[ ]TODO: 7. Intel GVT-d(passthrough)

需要导出 VBIOS 中的 GOP 驱动并在 kvm 中加载。

Games101 Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline) 笔记

Painter’s Algorithm: 从远到近绘制,覆盖所画物体

Z-Buffer: 离视点越近值越小(黑),越远值越大(白)

实现: 遍历三角形,随后遍历三角形内每个像素,若小于深度缓存值,更新像素信息,并更新深度缓存(仅适用于非透明物体)

Shading(in this course): The process of applying a material to an object.(着色与材质一起讲)

Specular highlights: 高光

Diffuse reflection: 漫反射

Ambient lighting: 环境光(一般为常量)

Blinn-Phong Reflectance Model: 见视频

Lambert’s cosine law: cos = l * n(光线方向与法线方向的乘积与其余弦值成正比)

光照强度与传播距离成平方反比

Lambertian (Diffuse) Shading: LaTex没学,在这里暂时不写公式了

Games101 Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering) 笔记

Video = Sample Time

Moire Patterns: 看图

Sample Artifacts: Jaggies, Moire, Wagon wheel effect, etc.

本质: Signals are changing too fast (high frequency), but sampled too slowly

High-frequency signal is insufficiently sampled: samples erroneously appear to be from a low-frequency signal.

Aliases(混叠): Two frequencies that are indistinguishable at a given sampling are called “aliases”

Filtering: 过滤一系列指定频率

High-pass filter(高通滤波): 保留高频信息,图像上显示为保留边界轮廓

Low-pass filter: 图像上显示为图像模糊(去除边界)

Filtering = Convolution(卷积) = Averaging

(到这里听傻了,没想到第一次听到卷积简化实现是在图形学课程)

结论: 时域卷积 = 频域乘积(时域乘积 = 频域卷积)

频率角度: Sampling = Repeating Frequency Contents(课程内有简单的原理解释)

Aliases 的信号角度: 采样速度较慢导致的频谱重复时的混叠

抗锯齿实现原理: 模糊(卷积,去掉高频信号)后采样 Convolve then sample

MSAA 原理: 在像素内部提高采样数

FXAA (Fast Approximate AA): 找到锯齿图像边界,后处理

TAA (Temporal AA): 复用上一帧结果,静止效果好

Super resolution / super sampling:

DLSS (Deep Learning Super Sampling)

(到最后其实还是没有时间讲 Z-Buffering 的事情2333)

Games101 Lecture 5 Rasterization 1 (Triangles) 笔记

FOV: field-of-view

Aspect ratio = width / height

视锥体定义(近平面):FOV 与宽高比定义

Screen(程序定义): 二维数组,每个元素代表一个像素

Screen Space: 课程以左下角为原点,实际由 API 确定

Canonical Cube to Screen: 视口变换,MVP 后转换至屏幕空间,变换矩阵见视频

成像设备(Display)专场:

Cathode Ray Tube(CRT): 熟悉的技术

Liquid Crystal Display(LCD)

其他的算科普,看看视频就行

Triangles: 优点很多,有许多不错的性质,看视频

Sampling: 采样,将函数离散化

染色:叉积计算像素中心是否在三角形内确定是否染色

Bounding Box: (优化)包围盒确定屏幕空间下三角形需要计算像素中心的范围

Axis-Aligned Bounding Box: 轴向包围盒

优化(?): 像扫描线一样一行一行判断

液晶的排列形式: 简单补充一下,见视频

三原色与三基色的区别

Aliasing(Jaggies): 走样(锯齿), 下节课

Games101 Lecture 4 Transformation Cont. 笔记

2022-05-11

昨天练了一晚上dps循环,没睡好头疼了一天,欠一节课

2022-05-12

今天没睡好,又欠一节

2022-05-13

写文章去了,再欠

2022-05-14

正交矩阵:矩阵的逆等于矩阵的转置,称为正交矩阵

Viewing transformation

  • View / Camera transformation
  • Projection transformation

Rotation around x-, y- or z-axis

三个轴的旋转矩阵,见视频

Often used in flight simulators: roll, pitch, yaw

以前没有注意到,其实飞行模拟实现就是这样

Rodrigues’ Rotation Formula,推导不太熟,课后学习下

MVP transformation - model /view / projection

View transformation 实践:

根据相机的位置、朝向、向上方向,先写出原始的由原点变换至相机位置的矩阵,随后转置,可得出将相机与其他模型转换到以相机为原点的坐标系的矩阵。

原理:旋转矩阵是正交矩阵。旋转矩阵的逆矩阵是逆向变换的矩阵,正交矩阵的逆等于转置

Perspective projection: 道理我都懂,为啥鸽子这么大

视频内有正交与透视投影的图像示意,看了图终于搞懂了

Model transformation 实践:

Orthographic Projection:

把Z轴扔掉(╯‵□′)╯︵┻━┻(想了想还真是这么回事)

正式做法:Canonical cube

Perspective Projection:

原理:远平面缩放至近平面的比例(相似),随后正交投影

实践:y’ = (n/z)*y (n和z的比值缩放三维坐标)

投影矩阵计算见视频,为节省计算量,计算矩阵时需要用n与f凑出该矩阵,避免使用xyz

Games101 Class3 Transformation 笔记

课程地址: https://www.bilibili.com/video/BV1X7411F744?p=3

主要是记概念,并增加点外部知识,实操请看视频

Why:运动、缩放、旋转、成像均与变换相关

How:通过对应关系(矩阵计算)进行变换,各类矩阵不再赘述(笔者偷偷用白纸默写各类矩阵了(雾))

普通平移操作不属于线性变换(需要矩阵相加)

齐次坐标:在图形学中将平移变换统一至矩阵运算中

平移变换统一:通过升维引入齐次坐标将平移统一至矩阵运算中,在保证平移不变性的同时下统一点与向量运算

仿射变换:上述操作用齐次坐标表示,此类表示仅限于仿射变换(后续有投影变换)

逆变换:逆矩阵

组合变换:旋转以原点为中心,顺序影响最终效果(矩阵乘法不满足交换律)

复习:不用齐次坐标表示,即为先线性变换,后平移