模型/场景对象
- 模型或者场景对象(这两个名词是一个意思)是通过几何图元,例如点,线和三角形来构建的
- 图元与模型的顶点(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)
- 帧缓存:
它是由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。
网友评论