OpenGL笔记-2.管线基本流程和各单元介绍
作者:互联网
OpenGL中的管线并不是一个具体的操作,而是一系列的串行操作,大约分为两个部分:客户端和服务端,并且这两个部位是相互独立的,不仅是在代码和软件层面,即使是在硬件层面也是相互独立的
管线基本流程:
管线又细分为固定管线和可编程管线,固定管线则只提供函数调用,内部不需要管,但可编程管线则需要理解下内部的工作了,下图就是一个可编程管线的基本流程
如图所示,上层为客户端,下层为服务端最上层是自己写的代码,然后是OpenGL提供的API,需要注意的是调用服务层的是OpenGL的API并非自己写的代码
一般来说客户端往服务端传入的数据是三类Attributes(属性),Uniforms(强行翻译的话属于渲染标准),Textrue Data(纹理数据),然后进入顶点着色器,也就是图中的Vertex Shader,然后处理各个顶点(比如各个顶点在屏幕的位置等等,因为一般传入的并不是一个实际值,还有可能会有位移,光影等等),也可以加一堆着色器来深度处理,然后数据进行图元合层(所谓的图元合成就是把各种顶点绘制成点线或者三角,然后形成图形),然后到片元着色器,然后渲染出所得的图形,需要注意的是Attributes无法直接给片元着色器,只能通过处理得到,而另外两个数据是完全可以直接给片元着色器的,三个数据并不是都需要的,比如着色不用特殊的纹理,则纹理数据就不用传了
属性包括的内容,比如顶点的位置,甚至也可以传颜色光影的法线等等,但很重要的是,属性只能给顶点着色器
Uniforms(统计标准),Uniforms是不让修改的,有点类似于宏定义,可以使用很多次,但不让改,Unifroms一般是一个批次的图元处理命令,Uniforms可以直接给片元着色器传递值,比如不需要顶点处理的数据等等
纹理数据,顶点着色器主要处理的是坐标,偏数字型的数据,而不管是什么纹理,所以纹理数据一般都是给片元着色器的
可编程管线的可编程内容就是顶点着色器和片元着色器
着色器
着色器有很多很多种,一般主要的是顶点和片元,这两个是必须的,另外还有8个是相对用的勤快的,剩下的就更冷门了,顶点和片元就不赘述了
虽然用N种着色器但使用却是没有什么太大区别
GLShaderManager shaderManager; //声明一个着色器
shaderManager.InitializeStockShaders(); //初始化一个着色器
shaderManager.UseStockShader(各种参数); //区别只在这里根据不同的着色器这里传入的参数也不一样
单元着色器 一般来说纯色就会用单元着色器,其参数值为GLT_ATTRIBUTE_VERTEX,也只能再传入一个颜色
平面着色器 一般来说放入一个图形需要变化则用平面着色器,具体的在后面详细补充,其参数是GLT_SHADER_FLAT,可以传入一个4*4的变化矩阵
上色着色器 在顶点着色器之后加入这个会填充颜色到对应的比如线的颜色,比如顶点处理过后的图形内部的填充颜色等等
默认光源着色器 一个3D更逼真,就需要各种光源,一个光源就会没那么立体,但如果有多个光源就会很立体了,但如果只有一个光源的话就会用这个,参数是GLT_SHADER_DEFAULT_LIGHT
点光源着色器 3D必备,自己设置位置,这样就很立体 参数是:GLT_SHADER_DEFAULT_LIGHT_DIEF
纹理替换矩阵 就是把纯色改变成豹纹啊什么的,毕竟单一颜色没啥意思,来点豹纹会添加点乐趣 参数是GLT_SHADER_TEXTURE_REPLACE
纹理调整着色器 适合口味比较重的朋友了,如果又想有狂野的味道,又喜欢比较单调的颜色就用这个,可以设置混合值 参数是:GLT_SHADER_TEXTURE_MODULATE
纹理光源着色器 把上面的全部混合起来,几乎所有参数都可以传,超高度定制化了参数是GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF
图元
即图片单元是所有图形的最小单元,之前说过只有点,线和三角形,点不说了,线在3D下可以是个3D的线环,三角形则能构成很多2D3D的图形
点 点设置大小的唯一方式就是gl_PoingSize = xx.f,然后就是坐标位置还有各种着色器去上色
线 线也没啥好说的两个或者多个坐标(多个点叫线带),如果再闭合就是线环,如果坐标和宽度设置到位,线环其实就像个戒指,然后线的宽度glLineWidth(xx.f)也是唯一的修改办法
三角形 三角形有且只能有三个顶点,多的话会变成单独的点线或者三角,而很多模型都是多个三角形拼凑的
标签:OpenGL,笔记,纹理,片元,顶点,GLT,着色器,管线 来源: https://blog.csdn.net/yokan_de_s/article/details/110874931