摄像机
发表于|更新于|OpenGL
|浏览量:
需要预先学习:
- 视图(摄像机)与投影
- 网格、材质与模型
相关推荐

2026-08-29
Compute Shader
需要预先学习: 着色器 缓冲对象与顶点 帧缓冲 Compute Shader 简介 计算着色器(compute shader)是 OpenGL 4.3 引入的着色器阶段。与顶点、片元着色器不同,它不在渲染管线里——不处理顶点、不产生片元,而是直接执行通用计算(GPGPU,General-Purpose GPU computing,用 GPU 做非图形计算)。 普通管线是单向的数据流:顶点 → 光栅化 → 片元 → 帧缓冲,着色器只是管道上的加工站。计算着色器是一块独立的"通用计算单元":你告诉它"开多少个线程、每个线程干什么",它就并行执行,结果可以写进纹理、缓冲,供后续渲染使用,也可以被 CPU 读回做逻辑。 线程模型:工作组 计算着色器的执行模型分两级:一次调度(dispatch)启动若干个工作组(work group),每个工作组内又有若干调用(invocation,即线程)。 概念 说明 工作组 一次调度划分出的执行块,数量由调度参数决定 调用 工作组内的单个线程,数量由着色器内的 ...

2026-08-29
PBR
需要预先学习: Phong模型与Blinn-Phong模型 渲染方程与重要性采样 PBR 基于物理的渲染 Phong模型与Blinn-Phong模型 中的两个模型都是经验模型(empirical model):用环境光、漫反射、高光三项拼凑出"看起来对"的结果,系数(shininess、ambientStrength)没有物理含义,换个光照环境就得重新调参。 PBR(Physically Based Rendering,基于物理的渲染)从物理规律出发建立反射模型:能量守恒、微表面反射、菲涅尔效应都被显式建模,材质参数直接对应真实世界的属性(金属度、粗糙度)。同一套参数在任何光照环境下都成立,这是 PBR 被游戏与影视工业广泛采用的原因。这篇笔记介绍渲染方程与 Cook-Torrance BRDF,并给出直接光照的 GLSL 实现。 渲染方程与 BRDF 辐射度量学速览 描述光的能量需要一套度量单位,辐射度量学(radiometry)提供这套语言: 物理量 符号 含义 单位 辐射通量 Φ\PhiΦ 单位时间通过的能...

2026-09-08
屏幕空间技术
需要预先学习: 帧缓冲 深度缓冲 前向渲染与延迟渲染 Bloom 什么是屏幕空间 前向渲染与延迟渲染 的光照 Pass 展示了一种新视角:不再遍历场景,而是对屏幕上每个像素从纹理里取数据做计算。把这种思路推广——所有输入只有"当前视角下已渲染的屏幕图像(颜色、深度、法线)"、所有计算都发生在全屏 pass 上的技术,统称屏幕空间(screen space)技术。 它与 全局光照与局部光照 的关系:环境光遮蔽、间接光、反射这些 GI 效果需要整条光路的信息,实时算不动;屏幕空间技术退而求其次——屏幕上看得见的部分,就是我能拿来用的全部: 真实 GI: 光线在完整场景中反弹(包括屏幕外、被遮挡的部分) 屏幕空间: 光线只在一层"屏幕贴片"上反弹(屏幕拍到的 2.5D 深度场) 代价与收益同样明确: 优点 缺点 输入只是几张全屏纹理,复杂度与场景规模无关 屏幕外的信息不存在:反射/AO 在物体进入屏幕的边缘消失 天然适配全屏 pass / compute shader,实现...

2026-08-29
伽马校正
需要预先学习: 纹理 着色器 为什么需要伽马校正 显示器是非线性的 伽马(gamma)问题源于一个物理事实:显示器的亮度响应不是线性的。CRT 时代的显像管,输入电压与输出亮度的关系近似幂函数 L=VγL = V^{\gamma}L=Vγ,γ≈2.2\gamma \approx 2.2γ≈2.2——输入电压翻倍,亮度远达不到两倍。LCD 虽原理不同,但为了兼容,也模拟这条曲线。 所以显示器上"0.5 的像素值"显示出来的物理亮度,只有"1.0 的像素值"的 0.52.2≈0.220.5^{2.2} \approx 0.220.52.2≈0.22,而不是一半。 人眼对暗部更敏感 人眼对暗部的亮度差异比亮部敏感得多——暗处稍微亮一点就能察觉,亮处变化却不易发现。利用这个特性,sRGB 编码(sRGB encoding)在存储颜色时给暗部分配更多精度:编码曲线近似 γ=1/2.2\gamma = 1/2.2γ=1/2.2 的幂函数,正好与显示器的 2.22.22.2 抵消。 于是图像文件(.png、.jpg 等)里存的不...

2026-08-29
ShadowMap与PCF、PCSS
需要预先学习: 阴影 ShadowMap 阴影 中讲过 ShadowMapping 的原理:把深度测试搬到光源位置再做一遍,用"光源视角记深度 + 摄像机视角比深度"的两遍框架判断片元是否被遮挡。这篇笔记把它落地成 OpenGL 代码,并在这个基础上实现 PCF 与 PCSS。 基本原理回顾 ShadowMapping 分两遍渲染: Pass 1:从光源渲染场景,只记深度。 平行光配正交投影,把场景画进一张深度贴图(depth map)——只写深度缓冲,不写颜色。深度贴图记录了从光源看过去每个方向上最近的表面距离。 Pass 2:从摄像机正常渲染场景。 着色时把片元变换到光源的观察空间,投影得到它对应的贴图坐标与深度,与贴图中记录的最近深度比较:片元更远,说明它前面有别的表面挡光,在阴影中。 // 伪代码:Pass 2 中的阴影判断 float d_frag = to_light_view(fragment.pos).z; // 片元在光源视角下的深度 float d_map = shadow_map.sample(uv); ...

2026-08-29
帧缓冲
需要预先学习: 缓冲对象与顶点 深度缓冲 帧缓冲(Framebuffer) 着色与渲染管线 的片元处理结束时,通过所有测试的片元会被写入帧缓冲(framebuffer)——渲染管线的最终目的地。默认情况下这个目的地是屏幕:窗口系统在创建窗口时自动配置好一块帧缓冲,渲染结果直接显示。帧缓冲对象(FBO,Framebuffer Object)允许你把渲染目标从屏幕换成自定义的纹理或缓冲,这是后处理、阴影贴图、环境光预计算等一切"渲染到纹理"技术的基础。这篇笔记介绍 FBO 的三种附件(颜色、深度、模板),并重点讲清片元何时写入附件。 默认帧缓冲 深度缓冲 中讲过,帧缓冲不是一个单独的缓冲,而是多块逐像素并列的存储的集合: 缓冲 存储内容 每个像素存什么 颜色缓冲(color buffer) 片元最终颜色 一个 RGBA 颜色值 深度缓冲(depth buffer) 当前最近的深度 一个深度值 模板缓冲(stencil buffer) 模板测试用的标记 一个整数 默认帧缓冲由窗口系统(Win32、X...


