美文网首页
OpenGL初识

OpenGL初识

作者: windy_3c22 | 来源:发表于2020-07-03 22:54 被阅读0次

    1、 简介

    1.1 OpenGL(Open Graphics Library)

    跨编程语言、跨平台的编程图形 接口,接口的实现由显示设备厂商提供,而且依赖于厂商提供的硬件设备也是一个标准,将计算机资源抽象称为OpenGL对象,对资源的操作抽象为OpenGL指令。主要用于pc端处理图形、图像。

    1.2 OpenGL ES (OpenGL for embedded Systems )

    OpenGL的子集、针对手机、PDA和游戏主机等嵌入式设备设计,去除了许多不必要和性能较低的API接口.

    1.3 DirectX

    一个属于Windows上多媒体处理API(包含显示,声音,输入,网络四大部分),不支持跨平台,只支持Windows

    1.4 Metal

    Apple为解决3D渲染推出的框架。能3D图像提高10倍的渲染性能。苹果底层渲染由metal实现。
    2018苹果弃用了OpenGL ES,底层渲染迁移至metal

    1.5 OpenGL与OpenCV

    OpenGL: 做图形渲染,显示位图
    OpenCV:识别(人脸、物体、身份识别)
    Open CV face++ 与人工智能结合使用

    1.6 功能

    游戏开发中,渲染游戏人物、游戏场景
    音视频开发中,对解码后的数据进行渲染
    地图开发中,对地图上的数据渲染
    在动画中,实现动画绘制
    处理视频时,进行添加滤镜效果

    2、专业名称解析

    2.1 上下文[context]

    在应用程序掉用任何OpenGL指令之前,需要安排首先创建一个OpenGL上下文(实质是一个状态机,保存OpenGL中各种状态,执行指令的基础)

    2.2状态机

    描述一个对象在其生命周期内所经历的各种状态,状态转变、发生转变动因、条件、所执行的活动。(或者一种行为,说明对象在其生命周期中响应事件所经历的状态序列及对状态事件的响应)。

    • 特点:
    • 记忆功能(当前状态)。
    • 输入、输出(根据输入内容+自己原先状态,修改自己当前状态,可以对应输出)。
    • 特殊状态(停机状态,不接受输入,停止工作)

    2.3 渲染(Rendering)

    将图形/图像数据转换成2D空间图像操作。

    2.4 顶点数组(vertexArray) 顶点缓冲区(VerterxBuffer)

    顶点是定点位置的数据存储在内存中。所以的顶点数据组成的数据叫定点数组。
    顶点数据是图像的骨架,在OpenGL中图像都是由图元组成,在OpenGLES中有3种类型的图元:点、线、三角形
    在调用绘制方法,顶点数据有内存传入顶点数字。GPU会提前分配一块显存,将顶点数组数据预先传入分配的显存中,这部分显存被称为顶点缓冲区

    2.5 管线

    在OpenGL下显卡在处理数据的时候是按照一个固定的顺序而且 严格按照这个顺序(不能打破),称为管线。

    2.6 固定管线(存储着色器)

    封装的固定的shader程序(内置的一段包含了光照、坐标变换、裁剪等诸多功能的固定shader程序)。开发者绘制时只需要传⼊相应的参数,就能快速完成图形的渲染,不需要关注底层实现原理,因此被称为固定管线。
    随着需求的发展,固定管线或存储着色器⽆法完成每⼀个业务,对开发者开发 对顶点着色器和片元着色器编码配置,这样的着色器称为可编程着色器只⽀持顶点着色器和片段着⾊器这两个着⾊器。

    2.7着色器shader(片元、片段、像素着色器)

    OpenGL处理shader时,通过编译、链接等步骤,⽣成着⾊器程序,着⾊器程序同时包含了顶点着⾊器和片段着⾊器的运算逻辑。

    在OpenGL进行绘制的时候

    • 先由顶点着色器对传⼊的顶点数据进行运算。
    • 再通过图元装配,将顶点转换为图元。
    • 然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。
    • 最后,将栅格化数据传入片段着⾊器中进⾏运算。片段着⾊器会对栅格化数据中的每⼀个像素进行运算,并决定像素的颜⾊
      顶点->图元->片元-> 像素

    常见着色器:
    顶点着⾊器VertexShader
    ⽚段着⾊器FragmentShader/像素着⾊器PixelShader/片元着色器
    ⼏何着⾊器 GeometryShader
    曲⾯细分着⾊器TessellationShader

    2.8 顶点着色器

    处理图形顶点的变换[旋转/平移/投影等]
    每一个顶点数据都会执行一次(并行,运算中无法访问其他顶点数据)
    典型的需计算的顶点属性(坐标变换、逐顶点光照运算等,自身坐标转换归一化坐标系)

    2.9 片元着色器

    处理图形每一个像素点颜色计算和填充

    2.10 光栅化Rasterization:把顶点数据转换为片元的过程

    把物体的数学描述以及与物体相关的颜色信息转换为屏幕上⽤于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化
    确定绘制区域:把物体的数学描述以及与物体相关的颜⾊信息转换为屏幕上用于对应位置的像素
    填充颜色

    2.11 位图

    假设120 * 120像素的一张图片,这张图占14400个像素,RGB是0-255是256种颜色,就是2的八次方种也叫8位深,一个字节占八位,RGBA是4个字节
    120 * 120 = 14400 -> RGBA -> 14400 * 4 = 位图

    2.12 纹理

    渲染图形时需要编码填充图片使用的图片就是纹理(存储格式.tag)

    2.13 混合

    两张有透明度的图片重叠时,重叠部分的颜色需混合计算

    2.14 变换矩阵(Transformation)

    图形发⽣平移,缩放,旋转需使用变换矩阵(坐标乘以变换矩阵)

    2.15投影矩阵(Projection)

    用于将3D坐标经过投影矩阵 转换为二维屏幕坐标

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

    • 渲染缓冲区一般映射的是系统的资源(例:窗口)。如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上。
    • 如果每个窗口只有一个渲染缓冲区,那么在绘制过程中屏幕进行了刷新,窗口可能显示不出完整的图像。
    • 常规的OpenGL会有两个缓冲区:显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示。
    • 由于显示器的刷新是逐行进行的,因此为了防止交换缓冲区的时候出现两个缓冲区的内容,因此交换一般等待显示器刷新完成的信号,在显示器两次刷新的间隔中间进行交换,这个信号就是垂直同步信号,这个技术就是垂直同步。
    • 使用了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后才能进行下一帧的渲染,使得帧率无法达到硬件的最高水平。为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区进行交换,实现充分利用硬件性能的目的。

    2.17 着色器渲染流程

    屏幕快照 2020-07-03 22.49.50.png

    3、投影方式

    3.1 正投影

    不管远近1:1进行绘制呈现2D效果
    GLFrustum类SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)

    3.2 透视投影

    远小近大呈现3D效果
    GLFrustum类通过setPerspective构建一个透视投影
    SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
    fFov:垂直⽅向上的视场角度
    fAspect:窗口的宽度与高度的纵横⽐
    fNear:近裁剪面距离
    fFar:远裁剪⾯距离
    纵横⽐比 = 宽(w)/⾼高(h)

    4、坐标系

    OpenGL希望每次着色后,可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC),每个顶点(x,y,z)的取值都在-1到1之间,超出这个范围顶点不可见

    • 物体的坐标变换到屏幕上的二维坐标和像素,共经历5个不同的坐标系:
    • 局部空间/物体空间,
    • 世界空间,
    • 观察者空间/视觉空间,
    • 剪裁空间,
    • 屏幕空间,

      需要用的变换矩阵有模型,观察,投影,具体流程如下: 屏幕快照 2020-07-03 22.14.48.png

    相关文章

      网友评论

          本文标题:OpenGL初识

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