侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

openGL

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 103 阅读 / 3,667 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
在着色器中所做的矩阵乘法是每个顶点一次
Transf==[投影矩阵]⋅[观察矩阵]⋅[位移矩阵]⋅[旋转矩阵]⋅[缩放矩阵][投影矩阵]⋅[观察矩阵]⋅[世界矩阵]

现在有三个矩阵了,我们应稍微思考一下这些矩阵的生命周期。在游戏运行时,投影矩阵应该不会有太多的变化,最坏的情况下,每次渲染可能改变一次。如果摄像机移动,则观察矩阵在每次渲染时可能改变一次。每渲染一个GameItem实例世界矩阵都会改变一次,一次每次渲染调用都会改变多次。因此我们应该将多少矩阵传递到顶点着色器呢?你可能会看到一些代码,为三个矩阵分别定义一个Uniform,但理论上最有效的方法是将投影矩阵和观察矩阵组合,将其称为pv矩阵,并传递world和pv矩阵到着色器。这样,我们可以使用世界坐标,并可以避免一些额外的运算。但实际上,最方便的方法是将观察矩阵与世界矩阵组合。为什么这样?因为要记住整个摄像机概念就是个骗局,我们所做的是移动整个世界来模拟摄像机的位移,并仅显示一小部分的三维世界。因此,如果直接处理世界坐标,可能会让远离原点的世界坐标遇到一些精度问题。如果在所谓的摄像机空间中处理,我们将处理的点虽然远离世界原点,但也靠近摄像机。可以将观察矩阵和世界矩阵组合的矩阵称为模型观察矩阵(Model View Matrix)。

OpenGL ES 主要这对嵌入式设备
图元 组成图像的基本单元,openGL中主要有7种,只是顶点的集合以预定义的方式结合在一起
GLSL 专为图形开发设计的语言




该渲染方式最初将以顶点缓冲区为形式的一系列顶点作为输入。如何描述三维空间中的一个点呢?通过指定其X、Y和Z坐标。
什么是顶点缓冲区?顶点缓冲区(Vertex Buffer)是使用顶点数组来包装所有需要渲染的顶点的另一种数据结构,并使这些数据能够在图形管线的着色器中使用。
这些顶点由顶点着色器(Vertex Shader)处理,顶点着色器的功能是计算每个顶点到屏幕空间中的投影位置。该着色器还可以生成与颜色或纹理相关的其他输出,但其主要目的还是将顶点投影到屏幕空间中,即生成点。
几何处理阶段(Geometry Processing)将由顶点着色器变换的顶点连接成三角形。它依照顶点储存的顺序,使用不同的模型对顶点进行分组。为什么是三角形?三角形就是显卡的基本工作单元,它是一个简单的几何形状,可以组合和变换,以构建复杂的三维场景。此阶段还可以使用特定的着色器来对顶点进行分组。
光栅化(Rasterization)阶段接收此前生成的三角形,剪辑它们,并将它们转换为像素大小的片元。
这些片元将在片元处理阶段(Fragment Processing)被片元着色器(Fragment Shader)使用,以生成写入到帧缓冲区的像素的最终颜色。帧缓冲区(Framebuffer)是图形管线的最终输出,它储存了每个像素应该被绘制到屏幕上的值。
注意,显卡被设计成并行处理上述所有操作,输入的数据可以并行处理以生成最终场景。
概念阶段
顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在现有的GPU中,这些工作由硬件实现的Vertex Shader(顶点着色器)完成。
光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。
像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。
最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。



OpenGL是一种图形应用程序编程接口(Application Programming Interface,API)。它是一种可以对图形硬件设备特性进行访问的软件库,OpenGL被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,完全通过软件的方式实现OpenGL的接口。OpenGL自身并不包含任何执行窗口任务或者处理用户输入的函数,也没有提供任何用于表达三维物理模型,或者读取图像文件(例如PNG、JPEG文件)的操作,一个用来渲染图像的OpenGL程序需要执行的主要操作如下:
. 从OpenGL的几何图元中设置数据,用于构建形状
. 使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置,颜色,以及其他渲染属性
. 将输入图元的数学描述转换为与屏幕位置对应的像素片元(fragment)。这一步也成为光栅化(rasterization),OpenGL的片元若最终渲染为图像,那它就是像素。
. 最后,针对光栅化过程产生的片元,执行片元着色器(fragment shader),从而决定这个片元的最终颜色和位置
. 如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行融合


渲染管线
对比网络处理的管线,管线就是把一系列需要顺序执行的操作放在一起.逐个执行.

顶点着色器:对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来处理顶点相关的数据。会转换坐标系,把数据变为openGL可用的数据,通常来说,一个复杂的应用程序可能包 含许多个顶点着色器,但是在同一时刻只能有一个顶点着色器起作用
细分着色器:顶点着色器处理每个顶点的关联数据之后,如果同时激活了细分着色器(tessellation shader),那么它讲进一步处理这些数据。细分 着色器会使用面片(patch)来描述一个物体的形状,并且使用相对简单的面片几何体连接来完成细分的工作,其结果是几何图元 的数量增加,并且模型的外观变得更加平顺。细分着色阶段会用到两个着色器来分别管理面片数据并生产最终的形状
几何着色器:允许在光栅化之前对每个几何图元做更进一步的处理
图元装配 : 图元装配将顶点与几何图元之间组织起来,准备下一步的剪切和光栅化工作
剪切 : 顶点可能落在视口(viewport)之外,此时与顶点相关的图元会做出改动,以保障相关的像素不会再视口外绘制
光栅化 : 剪切之后马上要执行的工作,就是讲更新后的图元传递到光栅化(rasterizer)单元,生成对应的片元。光栅化的工作是判断某一部分几何体(点、线、三角形)所覆盖的屏幕空间。得到了屏幕空间信息以及输入的顶点数据之后,光栅化单元就可以直接对片元着色器中的每个可变变量进行线性插值,然后将结果传递给用户的片元着色器。光栅化意味着一个片元的声明伊始,而片元着色器 中的计算过程本质上意味着计算这个片元的最终颜色,它决不等价于OpenGL对这个片元所执行的全部操作
片元着色器: 这个最后一个可以通过编程控制显示颜色的阶段。片元着色器计算片元的最终颜色(尽管在逐片元操作中可能还会最终改变一次颜色)和它的深度值。片元着色器会使用纹理映射的方式,对顶点处理阶段所计算的颜色纸进行补充。如果我们觉得不应该继续绘制某个片元,在片元着色器中还可以终止这个片元的处理,这一步叫做片元的丢弃(discard)。总之,顶点着色(包括细分着色和几何着色)决定了一个图元应该位于屏幕的什么位置,而片元着色使用这些信息来决定某个片元的颜色应该是什么
逐片元的操作:除了在片元着色器中做的工作之外,片元操作的下一步就是最后的独立片元处理过程。这个阶段里会使用深度测试(depth test)和模板测试(stencil test)的方式来决定一个片元是否是可见的。如果一个片元通过了所有的测试,那么它就可以被直接绘制到帧缓存中了,它对应的像素的颜色值(也可能包括深度z值)会被更新,如果开启了混合(blending)模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。

0

评论区