顺序无关半透明:Weighted Blended
所有基于排序的 OIT 算法实际上都需要大量的计算资源,不管是基于图元的排序还是基于像素的排序。 Blend 中的 OVER 操作 Blend 计算的基本思想是: C_f=C_1+(1-\alpha_1)C_0 这里,与上一篇博客 顺序无关半透明:Depth Peeling 中的定义一样,C_0 表示 premultiplied-alpha color,预先乘上了 \alp […]
所有基于排序的 OIT 算法实际上都需要大量的计算资源,不管是基于图元的排序还是基于像素的排序。 Blend 中的 OVER 操作 Blend 计算的基本思想是: C_f=C_1+(1-\alpha_1)C_0 这里,与上一篇博客 顺序无关半透明:Depth Peeling 中的定义一样,C_0 表示 premultiplied-alpha color,预先乘上了 \alp […]
由于光栅化渲染 API 只能保存一个像素的深度(通常为最近像素的深度),所以光栅化渲染天生具有半透明渲染的劣势。通过到相机的距离对图元进行排序可能有所帮助,但排序是计算密集型的,必须在每一帧完成,而且如果图元相互交错,就会出现无法修复的错误。 Depth peeling Depth peeling 的中文意思是深度剥离,本质也类似。先渲染最远的一层深度的像素,然后将它剥离掉,然后再 […]
智能指针(管理指针的模板类)是 C++11 之后添加的新特性,它们非常有用,但是智能指针经常会带来内存碎片。游戏程序的内存往往非常紧张,所以这里探究了一下 std::shared_ptr 的内存分配以及内存同步的问题。 测试使用的是 vc141 x86 平台。 std::shared_ptr 内存分配 std::shared_ptr 的原理是引用计数。相比裸指针,智能指针需要在 […]
四元数是用来表示旋转与方向的工具,它在 1843 年由 William Rowan Hanmilton 发明,作为复数的一个拓展被提出,直到 1985 年由 Shoemake 引入到计算机图形学中。四元数在许多方面都比欧拉角以及矩阵更优秀,在计算机图形学领域被广泛运用。任何三维方向都可以表达为一个绕特定轴的旋转,如果给定了轴和角度,可以非常直白地得到四元数,而欧拉角的转换就要复杂得多 […]
前言 渲染管线是将三维场景转化为二维图像的函数,只需要给定三维对象、光源等等。三维物体的显示效果由材质属性、光源、纹理、采用的着色方程共同决定。 架构 渲染管线就像流水线一样,每一层级联,每个阶段完成特定的任务。每个管线任务是并行化运行的,而管线内部的阶段则是依赖于前一个阶段的输出。 首先,渲染管线可以粗略地分为四个主要的阶段——应用-几何处理-光栅化-像素处理。应用阶段通常由 C […]
在游戏中经常有需要用到多视口渲染的地方,比如级联阴影技术(CSM)、立方体贴图(Cube Map)、虚拟现实(VR)等等。 实质上,在 OpenGL4.1 之后,几何着色器(GS)已经开始支持 gl_ViewportIndex,也就具有了多视口渲染的能力。在进行多视口渲染时,GS 往往会成为性能瓶颈,因为所有的顶点数据都是通过 GS 分发到不同的视口中。所以 GPU 厂商都提供了一些语 […]
雅可比矩阵 假设某函数 \mathbb{R}^n 需要映射到另一个空间 \mathbb{R}^m 中,雅克比矩阵就是从 \mathbb{R}^n 到 \mathbb{R}^m 的线性映射,其重要意义在于它表现出了多维对多维空间的一个最佳线性估计。因此,雅可比矩阵类似于单变量函数中的导数。事实上,在单变量函数中,导数就是 1\times 1 阶的雅可比矩阵。 注意,以下的推导的矩阵都是行 […]
如果要平滑地显示一条直线,理论上需要无限大的分辨率。当前显示器的效果还远远没有达到匹配眼睛分辨率的效果。如果想要在网格屏幕上捕捉一条直线,在直线跨像素时,必然会产生一个极小的阶梯型效果。如果多个阶梯出现在同一个区域,眼睛马上就能发现错误。为了尽可能减少这种跳变的影响,出现了抗锯齿技术(anti-aliasing)。 当前已经开发出了多种抗锯齿技术。最 […]
在各种渲染引擎中使用浮点数几乎可以肯定一定会产生浮点数误差,而渲染引擎的大量计算量也不允许使用其他特别高精度的浮点数,因而需要一定程度的精度补偿。事实上,浮点数并不适合用于精确计算,而适合进行科学计算。 float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double […]
指针继承自 C 语言,也是操作数据最灵活最强大的武器;REF,中文名为引用,则可以认为是指针的一个“语法糖”。REF 使用起来更方便、更安全、也更可靠,它和指针一样也具有多态性。 指针 指针可以看成一个复合类型,它由 A 和 T 组成,A 表示指针指向的物理地址, T 表示地址包含的类型。通常来说,A 在运行 […]