OpenGL Shading Frequencies

July 10, 2022 · 0 min · Rick Cui

OpenGL 纹理采样

有两个不同的概念:像素(Pixel)和纹素(Texel) 在纹理上查询纹素有两种方式: 点查(Point Query):小纹理,而要对纹理放大 范围查(Range Query):动态生成 Mipmap 小纹理:低分辨率纹理应用到高分辨率设备,会产生马赛克问题 Nearest:邻近点 Bilinear:双线性插值 Bicubic: 大纹理:高分辨率纹理应用到低分辨率设备,会有 锯齿(Jaggies) 和 摩尔纹(Moire) 等 走样(Aliasing) 的问题 多重采样(supersampling) 面采样求平均值 Mipmap:图像金字塔 具有速度快、只是近似值且只能是方形范围的特点 会额外占用 1/3 的原始纹理显存空间,总共 4/3 的显存占用 三线性插值(Trilinear interpolation): 先在相邻两层 Mipmap 中分别进行 Bilinear 插值,再在结果之上进行线性插值 局限性:会存在 overblur 的问题 各项异性过滤(Anisotropic Filtering)(Ripmap): 对于平行于坐标轴的矩形区域查询有较好的表现,但是对于非矩形区域仍是效果不佳 会额外占用 3 倍的显存空间 纹理映射的不规则区域 EWA Filtering:...

July 10, 2022 · 1 min · Rick Cui

OpenGL 重心坐标与插值

重心坐标在投影下不是不变的,所以如果要获取光栅化后三角形内部像素点的深度,不能使用光栅化后三角形的重心坐标进行插值,而是要先找到像素点中心位置对应的三维世界的三维坐标,在三维世界中进行深度插值计算。 参考: 利用重心坐标平滑插值三角形顶点的任何属性 GAMES101-现代计算机图形学入门-闫令琪

July 9, 2022 · 1 min · Rick Cui

OpenGL 相机 LookAt 矩阵计算

原理: 相机的运动实际上是对世界坐标系中的物体进行反向运动变换 相机的运动矩阵与其他物体的变换矩阵类似 先缩放变换,再进行旋转,最后进行平移 所以 glm::lookAt 函数返回的是相机变换矩阵的逆矩阵 先对相机的平移矩阵求逆,然后乘以旋转矩阵的逆矩阵(参考计算矩阵乘积的逆矩阵公式) 注意事项: 相机矩阵的 Z轴 与相机的照射方向相反 glm 中的矩阵是列向量优先 正交矩阵的逆矩阵等于它的转置 刚体运动中变换矩阵的逆矩阵求解: 刚体运动变换矩阵: $$\begin{equation} T = \begin{bmatrix*}[c] R & t \newline 0^T & 1 \end{bmatrix*} \end{equation}$$ 分块矩阵求逆公式 $$\begin{equation} M = \begin{bmatrix*}[c] A & B \newline 0 & D \end{bmatrix*} \space\space\space\space M^{-1} = \begin{bmatrix*}[c] A^{-1} & -A^{-1}BD^{-1} \newline 0 & D^{-1} \end{bmatrix*} \end{equation}$$ 刚体运动变换矩阵的逆矩阵: $$\begin{equation} T^{-1} = \begin{bmatrix*}[c] R^{-1} & -R^{-1}t \newline 0^T & 1 \end{bmatrix*} = \begin{bmatrix*}[c] R^T & -R^Tt \newline 0^T & 1 \end{bmatrix*} \end{equation}$$ 方法一: glm::mat4 Camera::calculateLookAtMatrix() { // 1....

June 28, 2022 · 2 min · Rick Cui

OpenGL 渲染管线

红宝书第九版,OpenGL Version 4.5 Games101 闫令琪 顶点数据->顶点着色器(MVP 矩阵变换,NDC 标准化设备坐标)->细分控制着色器->细分计算着色器->几何着色器->图元装配->裁剪和剔除->光栅化->片元着色器 片元着色器后,可能还有混色、测试等流程,最后将渲染结果输入到 Frame Buffer 中 顶点着色器: 将传入的顶点坐标进行 MVP 矩阵变换,经过顶点着色器,它们就该是标准化设备坐标。 细分着色: 细分着色包括细分控制着色器和细分计算着色器,细分控制着色器和细分计算着色器是相互依存的,要么都不要,要么都要。细分着色的作用就是通过面片(patch)来描述一个物体的形状。顶点着色器只能处理每个顶点关联的数据,而细分着色能通过面片的形式分割更多的数据点(比如曲面细分) 细分控制着色器:细分控制着色器的一个常见应用就是将输入面片顶点(控制点)传递给细分计算着色器和通过设置细分层次因素,告诉 OpenGL 怎么生成顶点,每个顶点的标注化二维坐标(细分坐标)以二维向量(也就是说只有其 x 和 y 分量是有效的)的方式保存在变量 gl_TessCorrd 内,该变量会被传递到细分计算着色器中(注:gl_TessCorrd 保存的是一个线段的因子,如一个线段的 0.5 横坐标处,那么 gl_TessCorrd.x=0.5); 细分计算着色器:细分控制着色器完成后,细分计算着色器就通过控制点和细分坐标生成一系列顶点坐标,输出跟顶点着色器是一样的。 更多细节:可以看文章OpenGL 图元处理 几何着色器: 几何着色器提供了一种更加灵活的图元生成方法,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。原理上来说,几何着色器通过一些手段也可以完成细分着色器的任务,但是为什么需要细分着色器呢?这是因为在某些图元生成上,细分着色器可以更加精确或者方便,比如生成三角形网格顶点,更多介绍参见几何着色器。可以看到,顶点着色器,细分着色器和几何着色器本质上都是对顶点进行处理。 图元装配: 前面的着色阶段都对顶点进行操作,关于这些顶点如何被组织成几何图元的信息并传到到 OpenGL 的下个阶段。图元组装阶段将顶点组织成它们相关的几何图形,为裁剪和光栅化做准备。 裁剪和剔除: 偶尔,顶点会在视口之外(窗口的区域),并对与顶点相关的图元进行修改,使其像素都不在视口之外。这个操作被称为裁剪,并由 OpenGL 自动处理。 光栅化: 经过以上步骤,基本上一个图形就形成了,但是这个图形的坐标还是在自己的坐标系中,光栅化就是将图形的坐标转化为屏幕像素坐标,最终将图元的数学描述转化为用于显示在屏幕上的片段,然后通过帧缓存就可以在电脑上看到一个个美丽的图形。 片元着色器: 片元着色器是opengl渲染的最后一个流程,它的主要作用就是赋予我们图形最终的颜色,纹理渲染也在这个阶段 参考: 顶点着色器到片元着色器的过程,varying变量 opengl基本流程 OpenGL学习脚印: 投影矩阵和视口变换矩阵(math-projection and viewport matrix) OpenGL入门(五)– OpenGL渲染流程图解析 Opengl复习笔记(一)——顶点着色器、片段着色器(内含代码) GPU是如何工作的?Shader图形编程入门 GAMES101-现代计算机图形学入门-闫令琪 20分钟让你了解OpenGL——OpenGL全流程详细解读 OpenGL学习:Per-fragment operation(1)-模板测试(stencil test)

June 17, 2022 · 1 min · Rick Cui