第二人生的源码分析(五十五)OpenGL的API函数管理

对于高性能的3D游戏显示,目前在世界上流行的就两套API,一套是OpenGL,一套是微软的D3D。由于OpenGL跨平台的特性,对于第二人生来说,是没有别的选择了。那么在第二人生里渲染管道到底是怎么样调用OpenGL函数的呢?又有什么特别的方式可以让调用OpenGL更加方便呢?由于OpenGL并不是基于C++的接口,所以在第二人生里就肯定先把这些API组织成类的方式,才会更方便使用。下面就来仔细地分析类LLGLImmediate,它的声明如下:
#001 
#002 class LLGLImmediate
#003 {
#004 public:
#005       LLGLImmediate();
#006 
 
下面函数通过当前矩阵乘以参数构造的平移矩阵实现平移功能。
#007       void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
 
下面函数把当前矩阵压入到栈里,避免当前的操作对当前的矩阵下一次使用有影响。
#008       void pushMatrix();
 
下面函数把栈顶里的矩阵取出来,恢复前面保存的矩阵。
#009       void popMatrix();
 
下面函数指明像素混合的方式。
#010       void blendFunc(GLenum sfactor, GLenum dfactor);
 
下面函数指明一帧图片渲染开始。
#011       void start();
 
下面函数指明一帧图片渲染结束。
#012       void stop();
 
下面函数指明OPENGL一帧图片渲染生效。
#013       void flush();
#014 
 
下面两个函数指明OPENGL一帧图片渲染开始和结束。
#015       void begin(const GLuint& mode);
#016       void end();
 
下面的函数都是指明顶点。
#017       void vertex2i(const GLint& x, const GLint& y);
#018       void vertex2f(const GLfloat& x, const GLfloat& y);
#019       void vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z);
#020       void vertex2fv(const GLfloat* v);
#021       void vertex3fv(const GLfloat* v);
#022      
 
下面的函数指明纹理坐标位置。
#023       void texCoord2i(const GLint& x, const GLint& y);
#024       void texCoord2f(const GLfloat& x, const GLfloat& y);
#025       void texCoord2fv(const GLfloat* tc);
#026 
 
下面的函数都是指明当前顶点的颜色。
#027       void color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a);
#028       void color4f(const GLfloat& r, const GLfloat& g, const GLfloat& b, const GLfloat& a);
#029       void color4fv(const GLfloat* c);
#030       void color3f(const GLfloat& r, const GLfloat& g, const GLfloat& b);
#031       void color3fv(const GLfloat* c);
#032       void color4ubv(const GLubyte* c);
#033 
#034       // switch clever mode GL immediate rendering on or off. Setting to true builds
#035       // client arrays manually, setting to false passes through the GL immediate mode
#036       // commands to the GL implementation. Controllable by the RenderUseCleverUI
#037       // debug setting.
#038       // *NOTE: I have measured that this has about a 9% performance cost (0.6ms) for the
#039       // Render/UI fasttimer vs the old #if CLEVER compile time switch. Dave Parks and I
#040       // agreed that this was acceptable at the time due to it enabling better regression
#041       // testing for QA.
#042       // -Brad
 
下面指明是否使用顶点缓冲区来优化对API的操作,主要减少对API的操作,这样可以提高速度。
#043       void setClever(bool do_clever);
#044 
#045       typedef struct Vertex
#046       {
#047              GLfloat v[3];
#048              GLubyte c[4];
#049              GLfloat uv[2];
#050       };
#051 
#052 private:
#053       static bool sClever;
#054 
#055       U32 mCount;
#056       U32 mMode;
 
自己定义的顶点缓冲区,以便保存数据,最后一次性里设置到OPENGL里。
#057       Vertex mBuffer[4096];
#058 };
 
通过上面的函数,学会了怎么样封装OPENGL的API函数,并且提出了使用缓冲区的方法来提高渲染速度。在第二人生渲染管道里会不断地调用这个类的函数来操作OPENGL,这样比较容易维护,也达到更加容易使用的目的,并且全局只一个渲染对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值