美文网首页
OpenGL 初探

OpenGL 初探

作者: coder_feng | 来源:发表于2020-08-06 17:26 被阅读0次

    简介

    • OpenGL (Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令

    • OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口

    • DirectX:是由很多API组成的,DirectX并不是一个单纯的图形API. 最重要的是DirectX是属于Windows上一个多媒体处理API.并不支持Windows以外的平台,所以不是跨平台框架

    • Metal: Apple为游戏开发者推出了新的平台技术 Metal,该技术能够为 3D 图像提高 10 倍的渲染性能

    涉及到的概念

    • OpenGL 上下文
      在应用程序调用任何OpenGL的指令之前,需要安排首先创建一个OpenGL的上下文。这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态

    • OpenGL 状态机
      状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动

    • 渲染

    将图形/图像数据转换成3D空间图像操作叫做渲染(Rendering)
    

    流程图

    Snip20200806_6.png
    GPU 首先从vertex buffer中读取数据,然后通过vertex shader计算出各个顶点的具体位置,通过图元组装基本构成一个骨架,因为屏幕上只有二维坐标系,所以后续的操作是把三维的坐标系光栅化为二维,然后通过fragment shader映射出各个vertex所对应的像素值,当所有东西都准备好的时候把这些信息渲染到帧缓存中等待显示
    

    这里想说一点不同的是,OpenGL 4.3 的管线图渲染和OpenGL ES3.0 会稍微有一点不太相同,流程大概是如下:

    Snip20201224_9.png
    • 顶点数组(VertexArray--Vertex Array Object)和顶点缓冲区(VertexBuffer--Vertex Buffer Object)
      VBO 其实是用来存放顶点的缓冲区, VAO 是用来提高效率而诞生的,因为如果每次 CPU 向 GPU 传递相同的数据会浪费很多不必要的性能, 因此 VAO 通过记录一系列顶点的状态来达到没必要每次都要传递相同的数据给 GPU 提高性能
    OpenGL中的图像是由图元组成,在OpenGLES中,有3中类型的图元:点,线,三角形。这些数据直接由内存传入顶点数据,被称为顶点数组。而性能更高的做法是,提前分配一块显存,将顶点数据预先传入到显存当中,这部分的显存,就本称为顶点缓冲区
    
    • 管线
    在OpenGL下渲染图形,就会有经历一个一个节点,而这一的操作可以理解管线。
    
    • 固定管线/存储着色器
    在早期的OpenGL版本,它封装了很多种着色器程序块内置的一段包含了光照,坐标变换,裁剪等等诸多功能的固定shader程序来完成,来帮助开发者来完成图形的渲染,开发者只需要传入相应的参数,就能完成图形的渲染,不需要关注底层实现原理
    
    • 着色器程序Shader
    OpenGL在实际调用绘制函数之前,还需要指定一个由shader编译成的着色器程序。常见的着色器主要有顶点着色器(VertexShader),片段着色器(FragmentShader)/像素着色器(PixelShader),几何着色器(GeometryShader),曲面细分着色器(TessellationShader)。片段着色器和像素着色器只是在OpenGL和DX中的不同叫法而已。可惜的是,直到OpenGLES 3.0,依然只支持了顶点着色器和片段着色器这两个最基础的着色器
    
    • 顶点着色器VertexShader
    一般用来处理图形每个顶点变换(旋转平移投影等)
    顶点着色器是OpenGL中用于计算顶点属性的程序,顶点的着色器是逐顶点运算的程序,也就是说每个顶点数据都会执行一次顶点着色器(并行)
    
    • 片元着色器程序FragmentShader
    一般用来处理图形中每个像素点颜色计算和填充,片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是逐像素运算的程序,也就是说每个像素都会执行一次片段着色器(并行)
    
    • GLSL(OpenGL Shading Language)
    OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU执行的
    
    • 光栅化Rasterization
    是把顶点数据转换为片元的过程,具有将图形转化为一个个栅格组成的图像的作用,特点是每个元素对应帧缓冲区中的一像素
    光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。
    
    光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分工作:分配一个颜色值和一个深度值到各个区域。光栅化过程产生的是片元
    
    把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化,这是一个将模拟信号转化为离散信号的过程
    
    
    • FragmentShader
    根据纹理的顶点坐标,从烘焙好的纹理中采样对应顶点所对应的纹理
    
    • 混合(Blending)
    如果像素没有被剔除,那么像素的颜色将会和帧缓冲区的颜色附着上的颜色进行混合,混合的算法可以通过OpenGL的函数进行制定,但是混合算法是有限的,如果需要更加复杂的混合算法,一般可以通过像素着色器进行实现
    
    • 变换矩阵(Transformation)
    例如图形想发生平移,缩放,旋转变换,就需要使用变换矩阵
    
    • 投影矩阵Projection
    用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标系啊进行绘制
    
    • 渲染上屏/交换缓冲区(SwapBuffer)
    渲染缓冲区一般映射的是系统的资源比如窗口,如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上,之前每个窗口只有一个缓冲区,那么如果在绘制的过程中屏幕进行了刷新,窗口可能显示不出完整图像,为了解决这个问题,OpenGL程序至少都会有两个缓冲区,显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区,在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示,但是这个同样有个瓶颈问题,就是每次总是要等待缓冲区交换之后再进行下一帧的渲染,使得帧率无法完全达到硬件允许的最高水平,为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,而发生垂直同步时候,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,充分利用硬件性能目的
    
    • 纹理
    纹理可以理解问图片,大家在渲染图形时需要在其编码填充图片,为了使得场景更加逼真,而这里使用的图片,就是常说的纹理
    

    坐标系概念

    • 物体坐标系( Object or model coordinates)
    是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述
    
    • 世界坐标系(World coordinates)
    Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统
    
    • 摄像机坐标系(Eye (or Camera) coordinates)
    是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪
    
    • 裁剪坐标系(Clip coordinates)
    • 规范设备坐标(Normalized device coordinates)
    就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标
    
    • 屏幕坐标系(Window (or screen) coordinates)
    经过viewport mapping
    

    坐标的变化核心就是物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换

    OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换
    

    其中坐标的变换需要用到几个重要的变化矩阵,分别是模型(Model),观察(View),投影(Projection) 三个矩阵。物体顶点的起始坐标到局部空间(Local Space),也就是局部坐标,之后再变成世界坐标,观察坐标,裁剪坐标,最后到屏幕坐标

    OpenGL 坐标变换全局图

    Snip20200806_5.png

    图中模型变换,视变化,投影交换,这些变换可以由用户根据需要自行指定,这些内容在顶点着色器中完成;透视除法,视口变化,这两个步骤是OpenGL自动执行的,在顶点着色器处理后的阶段完成

    相关文章

      网友评论

          本文标题:OpenGL 初探

          本文链接:https://www.haomeiwen.com/subject/gelzrktx.html