OpenGL-专业名词解析

模型/场景对象

  • 模型或者场景对象(这两个名词是一个意思)是通过几何图元,例如点,线和三角形来构建的
  • 图元与模型的顶点(vertex)存在着各种对应关系

渲染(render)

  • 它标识计算机从模型创建最终图像的过程

图形/图像数据 => 3D空间图像

  • OpenGL是基于光栅化的系统来生成图像(会在下一篇内容有介绍)

渲染上屏/交换缓冲区(SwapBuffer)

  • 渲染缓冲区一般映射系统资源(比如将图像渲染到窗口对应渲染缓冲区,则直接可以屏幕上看到图像)
  • 每个窗口只有一个缓冲区,那就会带来一些可能的问题,比如在图像绘制过程中屏幕进行了刷新,那图像可能没办法完整显示出来
  • 为了解决上面的问题,OpenGL至少会有连个缓冲区,屏幕缓冲区和离屏缓冲区(顾名思义),这样可以通过缓冲区之间的交换来实现图像在屏幕上的显示
  • 垂直同步:刷新是逐行进行的,那为了防止交换缓冲区时屏幕屏幕上下区域属于不同的帧,交换一般会等待显示器刷新完的信号,也就是在其刷新的间隔进行交换,这个信号叫做垂直同步信号,这个技术叫做垂直同步
  • 三缓冲区技术:原理同上,只是引入该技术后可以做到,在等待垂直同步时,可以来回交替渲染两个离屏缓冲区,而在垂直同步发生时,可以在屏幕缓冲区和最近渲染完成的离屏缓冲区交换,从而最大化利用硬件性能
  • glFlush 强制刷新
  • glutSwapBuffers 交换缓冲区

管线

  • 管线的概念
    管线(pipeline),可以理解为渲染流水线。管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程的管理。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

  • 固定管线(存储着色器)
    可以简单理解为渲染图像的这个过程,我们只能通过调用GLShaderManager类的固定管线效果实现我们一系列的着色器处理。

  • 可编程管线
    可以简单理解, 在我们处理图形的过程,我们必须使用顶点着色器片元着色器过程。我们可以采用GLSL自行编写着色器程序,来执行这个过程的事情。


着色器

着色器是OpenGL最本质的概念,理解它最好的方法是把它看做是一种小型程序,用它来编译图形处理单元(即GPU)。

  • 它是图形硬件设备执行的一类特殊函数
  • OpenGL内部包含了所有的编译器工具,可以直接从着色器代码创建GPU所需的编译代码并执行。
  • OpenGL会用到四中着色阶段(shader stage),最常用的是顶点着色器片元着色器
  • 顶点着色器
    用于处理顶点数据
  • 片元/片段/像素着色器
    用于处理光栅化的片元数据

所有的OpenGL程序都需要用到这两类着色器

着色器就是控制GPU来进行计算的
ps:Metal里面叫片元函数


GLSL(OpenGL Shading Language)

OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片元着色器),有时还会有Geometry Shader(几何着色器)。


纹理

纹理,英文是texture,中文可以翻译成纹理、纹理图、纹理映射等等一堆东西。不过不管翻译成啥,讲的都是一个东西。我们通常说的纹理,指的是一张二维的图片,把它像贴纸一样贴在什么东西上面,让那个东西看起来像我们贴纸所要表现的东西那样。

有关纹理的详细介绍可以参照这篇文章

用一句话来总结,纹理就是一张贴到物体上的2维图像


变换矩阵(Transformation)

图形想发生平移,缩放,旋转变换,就需要使用变换矩阵。

/ 加载单位矩阵
void m3dLoadIdentity44(M3DMatrix44f m);
// 沿着 x/y/z 轴平移
void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z);
// 沿着 x/y/z 轴旋转 angle(弧度)
void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z);
// 在 x/y/z 轴上进行缩放
void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale);
// 矩阵 a 和矩阵 b 相乘得到矩阵 product
void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const  M3DMatrix44f b);

投影矩阵(Projection)

用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下绘制

  • 设置投影矩阵是通过视景体(GLFrustum)来设置的
[GLFrustum] { // 仅仅表示以下方法是 GLFrustum 的方法
    // 设置正投影矩阵参数,(x, y, z)最小和最大值
    void SetOrthographic(GLfloat xMin, GLfloat xMax, 
                         GLfloat yMin, GLfloat yMax, 
                         GLfloat zMin, GLfloat zMax);
    // 设置透视投影矩阵参数,分别为:透视角,宽高比,近距,远距
    void SetPerspective(float fFov, float fAspect, float fNear, float fFar);
    // 获取投影矩阵
    const M3DMatrix44f& GetProjectionMatrix(void);
}
  • 为了方便管理各个矩阵,GLTools 提供了矩阵堆栈 GLMatrixStack,默认堆栈最大深度为 64,有压栈、出栈等操作。
[GLMatrixStack] { // 仅仅表示以下方法是 GLMatrixStack 的方法
    // -------- 矩阵加载 -----------
    // 在栈顶载入单元矩阵,载入即覆盖
    void LoadIdentity(void);
    // 在栈顶载入任何矩阵
    void LoadMatrix(const M3DMatrix44f m);
    // 用栈顶矩阵乘以某个矩阵,得到的结果矩阵覆盖原来的栈顶矩阵
    void MultMatrix(const M3DMatrix44f mMatrix);
    // 获取栈顶矩阵
    const M3DMatrix44f& GetMatrix(void);
    // -------- 出栈压栈 -----------
    // 压栈,在栈顶压入一个矩阵
    void PushMatrix(const M3DMatrix44f mMatrix);
    // 出栈,把栈顶矩阵移除矩阵堆栈
    void PopMatrix(void);
    // -------- 仿射变换 -----------
    // 栈顶矩阵进行缩放变换
    void Scale(GLfloat x, GLfloat y, GLfloat z);
    // 栈顶矩阵进行平移变换
    void Translate(GLfloat x, GLfloat y, GLfloat z);
    // 栈顶矩阵进行旋转变换
    void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
}

有关像素

像素(pixel)是显示器上最小的可见单元。

  • 计算机系统将所有的像素保存到帧缓存(framebuffer)
  • 帧缓存
    它是由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。

你可能感兴趣的:(OpenGL-专业名词解析)