想要更深入的学习OpenGL
,就要先了解OpenGL
渲染架构图(如下图)。客户端和OpenGL
渲染服务严格遵循下图,不能更改,比如Attributes(ins)
只能作用于顶点着色器,来间接的影响片元着色器,但是不能作用于片元着色器。

由于
OpenGL
是基于C
的API
,因此它⾮常便携且受到⼴泛⽀持。作为C API
,它与基于Objective-C
的Cocoa
应⽤程序⽆缝集成。OpenGL
提供应⽤程序⽤于⽣成2D
或3D
图像的函数。您的应⽤程序将渲染的图像呈现给屏幕或将它们复制回⾃⼰的内存。OpenGL
规范没有提供⾃⼰的窗⼝层。它依赖于OS X定义的功能来将OpenGL
绘图与窗⼝系统集成。您的应⽤程序创建OS X OpenGL
渲染上下⽂并将渲染⽬标附加到其上(称为可绘制对象)。渲染上下⽂管理OpenGL
状态更改和通过调⽤OpenGL API
创建的对象。OpenGL
固定存储着色器有,单元着色器,平面着色器,上色着色器,默认光源着色器,点光源着色器,纹理替换矩阵着色器,纹理调整着色器,纹理光源着色器,这些着色器都不可以编程。1、单元着色器
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
参数1: 存储着⾊器种类-单元着⾊器
参数2: 颜⾊
2、平面着色器
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-平⾯着⾊器
参数2: 允许变化的4*4矩阵
参数3: 颜⾊
3、上色着色器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
参数1: 存储着⾊器种类-上⾊着⾊器
参数2: 允许变化的4*4矩阵
4、默认光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat
mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-默认光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜⾊值
5、点光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat
mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
参数1: 存储着⾊器种类-点光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源的位置
参数5: 颜⾊值
6、纹理替换矩阵着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat
mvMatrix[16],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
参数2: 模型4*4矩阵
参数3: 纹理单元
7、纹理调整着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat
mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理调整着⾊器
参数2: 模型4*4矩阵
参数3: 颜⾊值
参数4: 纹理单元
8、纹理光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G
Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源位置
参数5: 颜⾊值(⼏何图形的基本⾊)
参数6: 纹理单元
OpenGL
基本的图元链接方式参数,以及对应的图像(下图)。后面我用实际的案例,来一次使用这些图元来绘图。
图元 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是单独点 |
GL_LINES | 每⼀对顶点定义⼀个线段 |
GL_LINE_STRIP | 一个从第⼀个顶点依次经过每⼀个后续顶点而绘制的线条 |
GL_LINE_LOOP | 和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了 |
GL_TRIANGLES | 每3个顶点定义⼀个新的三角形 |
GL_TRIANGLE_STRIP | 共⽤一个条带(strip)上的顶点的一组三⻆形 |
GL_TRIANGLE_FAN | 以⼀个圆点为中⼼呈扇形排列,共⽤相邻顶点的⼀组三⻆形 |

头文件
其中比较之前多的为,GLMatrixStack.h,GLFrame.h,GLFrustum.h为矩阵工具类,GLGeometryTransform.h为变换管道类,用来快速在代码中传输视图/投影矩阵等。
#include "GLTools.h"
#include "GLMatrixStack.h"
#include "GLFrame.h"
#include "GLFrustum.h"
#include "GLBatch.h"
#include "GLGeometryTransform.h"
新增变量transformPipeline
transformPipeline
主要作用就是用来获取顶部矩阵堆栈的值。
//设置变换管线以使用两个矩阵堆栈
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
/* GLShaderManager 中的Uniform 值——平面着色器
参数1:平面着色器
参数2:运行为几何图形变换指定一个 4 * 4变换矩阵
--transformPipeline.GetModelViewProjectionMatrix() 获取的
GetMatrix函数就可以获得矩阵堆栈顶部的值
参数3:颜色值
*/
shaderManager.UseStockShader(GLT_SHADER_FLAT,
transformPipeline.GetModelViewProjectionMatrix(),
vGreen);
重要函数的变化changeSize
changeSize
函数中,不光要设置视口大小,还要设置图元绘制时的投影方式。并把投影矩阵载入到顶部的模型视图矩阵栈顶。
glViewport(0, 0, w, h);
//创建投影矩阵,并将它载入投影矩阵堆栈中
viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
//调用顶部载入单元矩阵
modelViewMatrix.LoadIdentity();
重要概念矩阵堆栈
//压栈
modelViewMatrix.PushMatrix();
//还原到以前的模型视图矩阵(单位矩阵)
modelViewMatrix.PopMatrix();
首先,视图变换一定会用到模型视图堆栈,然后立体图形变换就需要用到,投影视图矩阵堆栈。然后默认压栈是为了保存底部原来的视图堆栈,已达到随时可以复原的目的。下图可以清晰的解释压栈出栈。

网友评论