由于OpenGL是基于C的API,因此它非常便携且受到⼴泛支持。作为C API,它与基于Objective-C的Cocoa应用程序⽆缝集成。 OpenGL提供应用程序用于⽣成2D或3D图像的函数。您的应用程序将渲染的图像呈现给屏幕或将它们复制回自己的内存。
OpenGL规范没有提供⾃己的窗口层。它依赖于OS X定义的功能来将OpenGL绘图与窗⼝系统集成。您的应⽤程序创建OS X OpenGL 渲染上下文并将渲染目标附加到其上(称为可绘制对象)。渲染上下⽂管理OpenGL状态更改和通过调用OpenGL API创建 的对象
OpenGL渲染架构
从上面的架构图可知OpenGL渲染管线有3种数据传递方式
1、Attributes 只能传递到顶点着色器VertexShader
2、Uniforms 既能传递到顶点着色器,又能到达片元着色器
3、TextureData 既能传递到顶点着色器,又能到达片元着色器,但是纹理数据传递到顶点着色器没有任何意义
通常:
Attributes用来传递的数据包括:顶点数据 x,y,z,w、光照坐标、投影矩阵、模型矩阵、纹理坐标(图片映射坐标)
Uniforms通常用来传递统一的批次内容(不经常改动的):时间戳,变换矩阵,颜色值
顶点着色器不能处理像素,通过顶点着色器桥接给片元着色器
OpenGL投影方式
正投影,使用场景:2D场景、一样大的效果
透视投影,使用场景:显示3D图像、远小近大效果
GLFrustum类通过setPerspective ⽅方法为我们构建⼀一个平截头体。 CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
参数:
fFov:垂直方向上的视场角度
fAspect:窗口的宽度与⾼度的纵横比
fNear:近裁剪⾯距离
fFar:远裁剪面距离
纵横比 = 宽(w)/高(h)
正投影与透视投影的区别:基于平面的方式还是基于立体的方式
固定管线下->8种存储着色器
a、单元着色器
GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4])
参数1: 存储着色器种类-单元着色器
参数2: 颜⾊
使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有⽚段都会以一种颜色填充
b、平面着色器
GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1: 存储着⾊器器种类-平⾯着⾊器
参数2: 允许变化的4*4矩阵
参数3: 颜色
使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化).
c、上色着色器
GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
参数1: 存储着⾊器种类-上⾊着⾊器
参数2: 允许变化的4*4矩阵
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 颜⾊将会平滑地插入到顶点之间称为平滑着色
d、默认光源着色器
GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-默认光源着⾊器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜⾊值
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着色器会使绘制的图形产⽣ 阴影和光照的效果
e、点光源着色器
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: 颜色值
使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产生阴影和光照的效果.它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的
f、纹理替换矩阵着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
参数2: 模型4*4矩阵
参数3: 纹理单元
使用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵.使⽤纹理单元来进行颜色填充.其中每个像素点的颜⾊是从纹理中获取
g、纹理调整着色器
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理调整着⾊器
参数2: 模型4*4矩阵
参数3: 颜⾊值
参数4: 纹理单元
使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理.将颜⾊与纹理进行颜⾊色混合后才填充到⽚段中
h、纹理光源着色器
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 以一个圆点为中⼼呈扇形排列,共用相邻顶点的一组三角形
OpenGL 点/线
//1.最简单也是最常⽤的 4.0f,表示点的⼤小
glPointSize(4.0f);
//2.设置点的⼤小范围和点与点之间的间隔
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;
//3.获取点⼤小范围和最⼩步长
glGetFloatv(GL_POINT_SIZE_RANGE ,sizes);
glGetFloatv(GL_POINT_GRAULARITY ,&step);
//4.通过使⽤程序点⼤小模式来设置点⼤小glEnable(GL_PROGRAM_POINT_SIZE);
//5.这种模式下允许我们通过编程在顶点着⾊器或⼏何着⾊器中设置点⼤小。着⾊器内建变量:gl_PointSize(内建变量),并且可以在着⾊器源码直接写
gl_PointSize = 5.0
//6. 设置线段宽度 glLineWidth(2.5f);
OpenGL三角形
对于OpenGL 光栅化最欢迎的是三⻆形.3个顶点就能构成一个三角形. 三⻆形类型来⾃于顶点.并不是所有的三角形都是正三角形等
在绘制第一个三角形时,线条是按照从V0-V1,再到V2。最后再回到V0的⼀个闭合三角形。 这个是沿着顶点顺时针方向。这种顺序与方向结合来指定顶点的方式称为环绕
在默认情况下,OpenGL 认为具有逆时针方向环绕的多边形为正面. 这就意味着上图左边是正⾯,右边是反面.(也可自己改变方向)
glFrontFace(GL_CW);
GL_CW:告诉OpenGL 顺时针环绕的多边形为正面;
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正面;
对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三角形. 这时我们可以使用GL_TRIANGLE_STRIP 图元绘制⼀串相连三⻆形,从⽽节省⼤量的时间
优点:
1. ⽤前3个顶点指定第1个三⻆形之后,对于接下来的每⼀个三⻆角形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采⽤这种⽅法可以节省⼤量的程序代码和数据存储空间
2.提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了
对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三角形. 这是我们可以使⽤GL_TRIANGLE_FAN 图元绘制一组围绕⼀个中⼼点相连的三⻆形