OpenGL 渲染基础补充
由于OpenGL是基于C的API,因此它⾮常便携且受到⼴泛⽀持。作为C的 API,它与基于Objective-C的Cocoa应⽤程序⽆缝集成。
OpenGL提供应⽤程序⽤于⽣成2D或3D图像的函数。您的应⽤程序将渲染的图像呈现给屏幕或将它们复制回⾃⼰的内存。
OpenGL规范没有提供⾃⼰的窗⼝层。它依赖于OS X定义的功能来将OpenGL绘图与窗⼝系统集成。您的应⽤程序创建OS X OpenGL 渲染上下⽂并将渲染⽬标附加到其上(称为可绘制对象)。渲染上下⽂管理OpenGL状态更改和通过调⽤OpenGL API创建的对象。
一.OpenGL投影方式分为:
OpenGL投影方式
1.正投影
OpenGL正投影
2.透视投影
OpenGL透视投影
GLFrustum类通过setPerspective ⽅法为我们构建⼀个平截头体。
CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar);
参数:
fFov:垂直⽅向上的视场⻆度
fAspect:窗⼝的宽度与⾼度的纵横⽐
fNear:近裁剪⾯距离
fFar:远裁剪⾯距离
纵横⽐ = 宽(w)/⾼(h)
二.存储着色器的初始化
//shareManager初始化
GLShaderManager shareManager;
shareManager InitializeStockShaders();
存储着色器分类:
存储着色器分类
三.OpenGL基本图元连接方式
基本图元连接方式
四.OpenGL基本图元
OpenGL基本图元
五.来点干货
1.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);
2.OpenGL绘制三角形
对于OpenGL 光栅化最欢迎的是三⻆形.3个顶点就能构成⼀个三⻆形. 三⻆形类型来⾃于顶点.并不是所有的三⻆形都是正三⻆形等。
使用GL_TRIANGLES绘制三角形
2.1OpenGL 三⻆形环绕⽅式
在绘制第⼀个三⻆形时,线条是按照从V0-V1,再到V2。最后再回到V0的⼀个闭合三⻆形。 这个是沿着顶点顺时针⽅向。这种顺序与⽅向结合来指定顶点的⽅式称为环绕
在默认情况下,OpenGL 认为具有逆时针⽅向环绕的多边形为正⾯. 这就意味着上图左边是正⾯,右边是反⾯.
OpenGL 三⻆形环绕⽅式
glFrontFace(GL_CW);
GL_CW:告诉OpenGL 顺时针环绕的多边形为正⾯;
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正⾯;
2.2OpenGL 三角形带
对于很多表⾯或者形状⽽⾔,我们会需要绘制⼏个相连的三⻆形. 这是我们可以使⽤GL_TRIANGLE_STRIP 图元绘制⼀串相连三⻆形,从⽽节省⼤量的时间
OpenGL 三角形带
优点:
1. ⽤前3个顶点指定第1个三⻆形之后,对于接下来的每⼀个三⻆形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采⽤这种⽅法可以节省⼤量的程序代码和数据存储空间。
2.提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了。
2.3OpenGL 三⻆形扇
对于很多表⾯或者形状⽽⾔,我们会需要绘制⼏个相连的三⻆形. 这是我们可以使⽤GL_TRIANGLE_FAN 图元绘制⼀组围绕⼀个中⼼点相连的三⻆形。
OpenGL 三⻆形扇
2.4OpenGL ⼯具类 GLBatch
GLBatch ,是在GLTools中包含的⼀个简单容器类.
void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);
参数1:图元
参数2:顶点数
参数3:⼀组或者2组纹理坐标(可选)
//复制顶点数据(⼀个由3分量x,y,z顶点组成的数组)
void GLBatch::CopyVerterxData3f(GLfloat *vVerts);
//复制表⾯法线数据
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
//复制颜⾊数据
void GLBatch::CopyColorData4f(GLfloat *vColors);
//复制纹理坐标数据
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);
//结束数据复制
void GLBatch::End(void);
//绘制图形
void GLBatch::Draw(void);