OpenGL 渲染流程图解析

作者: jakeXu | 来源:发表于2019-05-15 11:27 被阅读0次

    首先我来看一下渲染流程图,服务器端和客户端在功能和运⾏上都是异步,如下图:

    OpenGL渲染架构图.png

    1、客户端

    客户端为OpenGL API和调用API的不同语言代码,在CPU中执行的,只可以向服务端传递三种数据:
    Attributes、Uniforms、Texture Data
    其中Attributes只可以传递给顶点着色器,Uniforms和Texture Data可以传递给顶点着色器和片元着色器。
    

    Attributes(属性)
    就是对⼀个顶点都要作出改变的数据元素。实际上,顶点位置本身就是一个属性。属性可以是浮点类型、整型、布尔类型等。

    • 属性总是以四维向量的形式进行内部存储的,即使我们不会使用所有的 4个分量。一个顶点位置可能存储(x,y,z),将占有4个分量中的3个。实际上如果是在平面情况下:只要在xy平面上就能绘制,那么Z分量就会⾃动设置为0;
    • 属性还可以是:纹理坐标、颜⾊色值、光照计算表面法线
    • 属性会从本地客户机内存中复制存储在图形硬件中的⼀个缓冲区上。这些属性只提供给顶点着⾊器使用,对于片元着⾊器没有太大意义。
    • 声明:这些属性对每个顶点都要做改变,但并不意味着它们的值不能重复。通常情况下,它们都是不一样的,但有可能整个数组都是同一值的情况。

    Uniforms(统一值)
    通过设置Uniform 变量就紧接着发送一个图元批次处理命令。Uniform 变量实际上可以无限次的使用. 设置一个应用于整个表面的单个颜色值,还可以设置一个时间值。在每次渲染某种类型的顶点动画时修改它。

    • 这里的uniform 变量每个批次改变一次,而不是每个顶点改变一次
    • uniform变量最常见的应用是在顶点渲染中设置变换矩阵
    • 与属性相同点:可以是浮点值、整数、布尔值
    • 与属性不同点:顶点着⾊器和片元着⾊器都可以使用uniform变量。uniform 变量还可以是标量类型、⽮量类型、uniform矩阵。

    Texture Data(纹理数据)
    Texture Data:对纹理进行采样和筛选。纹理数据的作用不仅仅是表现图形。很多图形文件格式都是以无符号字节形式对颜色分量进行存储的,但我们仍然可以设置浮点纹理。这就是说,任何大型浮点数据块(例如消耗资源很大的函数的大型查询表)都可以通过这种方式传递给着色器。

    • 在顶点着⾊器、⽚元着⾊器中都可以对纹理数据进行采样和筛选
    • 典型的应⽤场景:⽚元着⾊器对⼀个纹理值进行采样,然后在⼀个三⻆形表⾯面应用渲染纹理数据
    • 纹理数据,不仅仅表现在图形,很多图形⽂件格式都是以⽆符号字节 (每个颜⾊通道8位)形式对颜色分量进⾏存储的

    2、服务端

    服务端为GPU硬件部分,主要由Vertex Shader、Primitive Assembly、Fragment Shader组成。
    

    Vertex Shader(顶点着色器)

    处理从客户机输⼊的数据、应⽤变换、进⾏其他的类型的数学运算来计算光照效果、位移、颜⾊色值等等。
    例如,为了渲染共有3个顶点的三角形,顶点着⾊器将执⾏3次,也就是为每个顶点执行⼀次。
    在⽬前的硬件上有多个执⾏单元同时运⾏,就意味着所有的3个顶点可以同时进⾏处理!
    

    Primitive Assembly(图元装配)

    根据图元类型把顶点组合在一起,并已经逐个片段的进⾏了光栅化。
    

    Fragment Shader(片元着色器)

    片元着色器/片段着色器/像素着色器,这三种称呼都可以,为每个像素点进行颜色和深度的计算与填充。
    最后输出我们屏幕上看到的视图图像。
    

    以上为OpenGL渲染流程的解析,有不正确的地方欢迎留言指出,有问题随时联系,有需要补充的也可以提出,谢谢。

    相关文章

      网友评论

        本文标题:OpenGL 渲染流程图解析

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