一、OpenGL渲染管线
1.客户端-服务器

管线一部分部分是客户端,另一部分是服务器。就OpenGL而言,客户端是存储在 CPU 存储器中的,驱动程序将渲染命令与数据组合起来发给服务器GPU执行。
2.数据缓存区buffer

因为从一块内存中将数据复制到另一块内存中,传递数据比较慢,而且在复制数据是的时候,CPU和GPU都不能操作数据(以免数据错误)。所以客户端不断的将数据和命令组合在一起送入缓冲区,缓冲区再发送到服务器执行。
二、管线流程图

管线中的着色器分为两类,一类是可编程管线着色器,另一类是固定管线着色器
顶点着色器的输入途径,attribute,textureData,uniform顶点着色器处理从客户端输入的数据,用数学运算来计算光照效果、位移、颜色值等。有几个顶点,顶点着色器就要执行几次。
图元组合(Primitive Assembly)框图意在说明3个顶点已经组合在了一起
片元着色器:片元着色器来计算像素点的最终颜色
顶点着色(包括细分和几何着色)决定了一个顶点位置,而片元着器的信息来决定某个像素点的颜色。
顶点着色器(必要)
细分着色器(可选)
几何着色器(可选)
片元着色器(必要)
1.单元着色器:绘制默认Open GL坐标下[-1,1]下的图形,图形中所有的片段都是用同一种颜色填充
GLShaderManager::useStockShader(v1,v2)
v1=GLT_Attribute_VERTEX
v2=GLFloat vColor[4]
参数1:存储着色器种类——单元着色器
参数2:颜色
2.平面着色器:在绘制图形时,可以应用变换(模型视图/投影)变化(旋转,平移,缩放)平面投影,透视投影,变换矩阵
GLShaderManager::useStockShader(v1,v2,v3)
v1=GLT_SHADER_FLAT
v2=GLFloat mvp[16]
v3=GLFloat vColor[4]
参数1:存储着色器种类-平面着色器
参数2:允许变化的4 * 4 矩阵(modelViewProjectionMatrix)
参数3:颜色值
3.上色着色器:在绘制图形时,可以应用各种变换,使颜色可以平滑的插入到顶点之间称为平滑着色
GLShaderManager::useStockShader(v1,v2)
v1=GLT_SHADER_SHADED
v2=GLFloat mvp[16]
参数1:存储着色器种类-上色着色器
参数2:允许变化的4 * 4 矩阵
4.默认光源着色器:在绘制图形时,可以应用变换,使得绘制的图形产生阴影和光照效果,这种光源类型类似太阳,平行光
GLShaderManager::useStockShader(v1,v2,v3,v4)
v1=GLT_SHADER_DEFAULT_LIGHT
v2=GLFloat mvMatrix[16]
v3=GLFloat pMatrix[16]
v4=GLFloat[4]
参数1:存储着色器种类-默认光源着色器
参数2:模型4 * 4 矩阵
参数3:投影4 * 4矩阵
参数4:颜色(绘制图形的颜色,并非光源的颜色)
5.点光源着色器:这种着色器会使绘制的图形产生阴影和光照效果,与默认光源着色器相似,只是光源位置特定
GLShaderManager:useStockShader(v1,v2,v3,v4,v5)
v1=GLT_SHADER_POINT_LIGHT_DIFE
v2=GLFloat mvMatrix[16]
v3=GLFloat pMatrix[16]
v4=GLFloat vLight[3]
v5=GLFloat vColor[4]
参数1:存储着色器种类-点光源着色器
参数2:模型视图矩阵4 * 4
参数3:投影矩阵4 * 4
参数4:点光源的位置
参数5.漫反射颜色值
6.纹理替换矩阵着色器:通过给定的模型视图投影矩阵,使用纹理单元进行颜色填充,其中每个像素点的颜色是从纹理中获取。
GLShaderManger::useStockShader(v1,v2,v3)
v1=GLT_SHADER_TEXTURE_REPLACE
v2=GLFloat mvMatrix[16]
v3=GLint nTextureUnit
参数1:存储着色器种类-纹理替换矩阵着色器
参数2:模型4 * 4 矩阵
参数3:纹理单元
7.纹理调整着色器:这种着色器通过给定的模型视图投影矩阵,将一个基本的颜色乘以一个取自纹理单元nTextureUnit的纹理,将颜色与纹理进行颜色混合后才填充到片段中。
GLShaderManager:useStockShader(v1,v2,v3,v4)
v1=GLT_SHADER_TEXTURE_MODULATE
v2=GLFloat mvMatrix
v3=GLFloat vCOlor[4]
v4=GLint nTextureUnit
参数1:存储着色器种类-纹理调整着色器
参数2:4 * 4 矩阵
参数3:颜色值
参数4:纹理单元
8.纹理光源着色器:着色器将一个纹理通过漫反射照明计算进行调整(叉乘)
GLShaderManger::useStockShader(v1,v2,v3,v4,v5,v6)
v1=GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF
v2=GLFloat mvMatrix[16]
v3=GLFloat pMatrix[16]
v4=GLFloat vLightPoint[3]
v5=GLFloat vBaseColor[4]
v6=GLInt nTextureUnit
参数1:纹理光源着色器
参数2:模型4 * 4矩阵
参数3:投影4 * 4 矩阵
参数4:点光源位置
参数5:颜色值
参数6:纹理单元
1.GL_POINTS 每个顶点在屏幕上都是单独的点
2.GL_LINES 每对顶点时一个线段
3.GL_LINE_SCRIP 连接成一条线带
4.GL_LINE_LOOP 连接成一个线圈
5.GL_TRIANGLES 每三个顶点连城一个三角形
6.GL_TRIANGLES_STRIP共用一条带上的顶点的一组三角形
7.GL_TRIANGLES_FAN 扇形
第一步:
main函数中调用setRC()
setRC中的四件事
1.clearColor
2.矩阵
3.cameraFrame观察者
4.设置顶点
第二步:changeSize
changeSize中的三件事:
1.glViewPort(0,0,w,h)
2.投影矩阵设置
3.模型视图矩阵设置
第三步:RenderScene
RenderScene中的五件事:
1.clearColor DEPTH STENCIL
2.压栈modelViewMatrix.PushMatrix(). multMatrix(objFrame).multMatrix(cameraFrame)
3.制造mvp: shaderManager::useStockShader(GLT_SHADER_FLAT,mvp)
4.draw potinBatch.Draw()
5.出栈和交换缓冲区:modelViewMatrix.PopMatrix()
glutSwapBuffers()