4、OpenGL初探之了解OpenGL渲染架构
2019-08-16 本文已影响0人
溪浣双鲤
前言: 前面我们了解了OpenGL API名词以及基本的渲染流程和基础的代码实战,现在我们来认识一下OpenGL的渲染架构。
由于OpenGL是基于C的API,因此非常便捷并且受到了广泛的支持。作为C API,它与基于Objective-C的Cocoa应用程序无缝集成。OpenGL提供应用程序用于生成2D或3D图像的函数。您的应用程序将渲染的图像呈现给屏幕或者将他们复制回自己的内存。
OpenGL规范没有提供自己的窗口层。它依赖于OS X定义的功能来将OpenGL绘图与窗口系统集成。您的应用程序创建OS X OpenGL上下文并将渲染目标附加到其上(称为可绘制对象)。渲染上下文管理OpenGL状态更改和通过调用OpenGL API创建的对象。
先直接上个OpenGL渲染架构图,然后我们来一步步分析
OpenGL渲染架构.png OpenGL.png一、OpenGL渲染主架构
OpenGL把渲染分为两个端,Server(服务端)和Client(客户端);
Client(客户端)指的是我们在CPU上存储的一些代码,
比如我们会编写C/C++代码和使用OpenGL的一些API,
而Server(服务端)其实调用的是GPU芯片。
我们开发的过程中会不断的用Client,通过OpenGL提供的通道去传递给Server执行,从而间接的操作GPU芯片。
二、OpenGL通道
OpenGL提供了三个通道,来供我们向服务端(Server)中的顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)传递参数和渲染信息,这三个通道分别是Attribute(属性通道),Uniform(统一变量通道),Texture Data(纹理通道)。
Attribute(属性通道):通常用来传递经常变化的参数。
比如颜色数据,顶点数据,纹理坐标,光照法线这些变量。
Uniform(统一变量通道):通常用来传递不变的参数。
比如变化矩阵,一个图形做旋转的时候,实质上是这个图形的所有顶点都做相应的变化,而这个变化的矩阵就是一个常量,这个就是Uniform通道传递参数到顶点着色器的一个实例。
再比如视频中间我们使用的颜色空间YUV,但是YUV颜色空间想要正常渲染到屏幕上面,就需要转化成RGBA颜色空间,这个转换就需要把YUV的颜色值乘以一个转换矩阵转换为RGBA颜色值,这个转换矩阵也是一个常量,这个是Uniform通道传递参数到片元着色器的一个实例。
Texture Data(纹理通道):纹理通道是专门用来传递纹理数据的通道。
但是这三个通道还是有区别的:
Uniform通道和Texture Data通道都可以直接向顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)传递参数,但是Attribute只能向顶点着色器传递参数,因为OpenGL架构在最初设计的时候,Attribute属性通道就是顶点着色器的专用通道。片元着色器中是不可能有Attribute的,但是我们可以使用GLSL代码,通过顶点着色器把Attribute信息间接传递到片元着色器中。
另外需要注意的是: 虽然Texture Data通道能直接向顶点着色器传递纹理数据,但是向顶点着色器传递纹理数据本身是没有实质作用的,因为顶点着色器并不处理太多关于纹理的计算,纹理更多是在片元着色器中进行计算的。