关于多视口渲染的两个拓展

    在游戏中经常有需要用到多视口渲染的地方,比如级联阴影技术(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 阶的雅可比矩阵。   注意,以下的推导的矩阵都是行 […]

抗锯齿技术之FXAA

  如果要平滑地显示一条直线,理论上需要无限大的分辨率。当前显示器的效果还远远没有达到匹配眼睛分辨率的效果。如果想要在网格屏幕上捕捉一条直线,在直线跨像素时,必然会产生一个极小的阶梯型效果。如果多个阶梯出现在同一个区域,眼睛马上就能发现错误。为了尽可能减少这种跳变的影响,出现了抗锯齿技术(anti-aliasing)。   当前已经开发出了多种抗锯齿技术。最 […]

OpenGL 中的 mipmap

  mipmap   使用 mipmap 时,OpenGL 根据被映射对象的大小(单位是像素),自动决定使用纹理图的哪个分辨率级别。mipmap 表示着纹理的层次细节(LOD),随着对象图像变小,使用纹理图的大小将减少。mipmap 需要一些额外的计算和纹理存储空间(大概三分之一),但这些消耗是值得的,如果不使用 mipmap ,那么映射到更小图像上的纹理将随着物体移动而闪烁。   Op […]

interface block 及 UBO、SSBO 详解

    前言   如果要将相机数据、光源数据同时传给地形着色器、阴影着色器等等要怎么做?一种简单的办法是在每个着色器中设置同样的 uniform 变量,然后各自赋值。但这个方法仍然显得太麻烦,有没有方法将数据存储在某个地方,然后需要的着色器自行读取呢?答案肯定是有的。   GLSL 3.1 版本开始支持 uniform block 的数据结构,它可以和 OpenGL 中定义的 uniform bu […]

OpenGL 4.6 新版本特性

        在2017年的 SIGGRAPH 上,Khronos 突然推出了 OpenGL 4.6。相比 OpenGL 4.5,这个版本加入了一些 Vulkan 的技术,进一步完善了 OpenGL。这代表OpenGL还没终结,以后还会绽放新的活力。   这几个扩展进入了核心: GL_ARB_gl_spirv 和 GL_ARB […]

OpenGL阴影采样器

  在 glsl 版本 1.30 之前,没有能与 sampler2DShadow 配合的纹理采样函数。在 1.40 版本开始,可以使用 texture 系的函数对阴影采样器进行采样,输入参数为 CVV 空间的三维坐标。   要使用 sampler2DShadow,需要做两件事。第一,需要开启比较模式,否则会行为未定义。有 sampler 或者 texture […]

OpenGL纹理格式

  glTexImage* 系列函数绝对是 OpenGL 最常用的函数。它的声明为: void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const […]

OpenGL 4.5如何绑定VBO

      OpenGL 4.3 的更新中,使用 glVertexAttribFormat 和 glBindVertexBuffer 取代 glVertexAttribPointer 来将 VBO 绑定到 VAO。由于老是忘记写法,故记录下来。本文使用 OpenGL 4.5 新增的 DSA 函数,最后会贴出与 4.3 函数的关系表,它们是一一对应的。 &em […]