OpenGLES 入门理解

先推荐几篇好的博文:

https://niyaoyao.github.io/2018/05/23/learning_opengl(es)_opengl_model_pipeline_and_practices/

https://blog.csdn.net/lance710825/article/details/78137950/

https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/04%20Hello%20Triangle/

 

这里不详细描述渲染管线的流程,大致写一下: 一堆顶点数据(OpenGL的坐标系),经过系列的变换,最终被GPU输出到FrameBuffer额过程.

一些基础的术语名词理解(个人理解;

这些顶点数据被放在一个数组中; 顶点数据一般是这个顶点的坐标(x,y,z);

顶点属性: 包含了一个顶点数据(顶点坐标)及其他属性, 如: 颜色(RGB),法向量(Normal),纹理坐标(Texture Coordinate)等属性

"顶点属性"意味着GPU中的shader程序每调用一次,顶点缓冲区都会为其提供一个新的顶点数据.

上图是一个包含了颜色的顶点属性

//接下来用顶点属性表示要被处理的数据; 可以认为顶点属性就是顶点数据

顶点缓冲区:  这些顶点属性都是要被复制到GPU中的内存(显存)中.

这个内存就被顶点缓冲对象(Vertex Vuffer Object, VBO)管理,我们可以认为VBO 就是一块内存区域,里面存储了一堆顶点属性;


//GLuint  无符号四字节整型,包含数值从0 到 4,294,967,295

GLuint VBO;
//生成一个VBO对象, 
glGenBuffers(1, &VBO);

glGenBuffers()

意思是该函数用来生成缓冲区对象的名称。

函数原型:void glGenBuffers(GLsizei n,GLuint * buffers);

glGenBuffers()函数 仅仅是生成一个缓冲对象的名称,类似c语言中的一个指针变量,仅仅是个缓冲对象,还不是一个顶点数组缓存. 

因为这时候根本没有进行内存分配, 可以理解只是声明了一个变量, 我们准备用这个变量来引用准备分配的内存.


GLuint vbo;
glGenBuffers(1,&vbo);
GLuint vbo[3];
glGenBuffers(3,vbo);

个人理解如下,可以声明一个GLuint变量,然后使用glGenBuffers后,它就会把缓冲对象保存在vbo里,当然也可以声明一个数组类型,那么创建的3个缓冲对象的名称会依次保存在数组里。

声明一个变量时,使用&VBO,声明一个数组类型,直接使用VBO; C语言, 数组名=数组首元素指针.

已经声明了缓冲对象, 那这个缓冲对象是什么类型,需要用到glBindBuffer();

函数原型:

void glBindBuffer(GLenum target,GLuint buffer);

第一个: 缓冲对象类型

第二个: 要绑定的缓冲对象的名称, 即我们在上一个函数里生成的名称.

按照我的理解 : 确定了VBO缓冲区类型.

在OpenGL红包书中给出了一个恰当的比喻:绑定对象的过程就像设置铁路的道岔开关,每一个缓冲类型中的各个对象就像不同的轨道一样,我们将开关设置为

bool AnimationManager::Load(const std::string &fileName;) { float width; float height; const char * path = MakePath(fileName.c_str()); std::string fullFileName = std::string(path); // Á‡„ÛʇÂÏ ÚÂÍÒÚÛÛ - Á‡ÔËÒ˚‚‡ÂÏ Û͇Á‡ÚÂθ ̇ Ì ‚ "tex", ÍÓÚÓ˚È ËÒÔÓθÁÛÂÚÒˇ ‰‡Î // // ̇˜‡ÎÓ ·ÎÓ͇ - ˝ÚÓÚ ÍÓ‰ ÔË ÔÓÚËÓ‚‡ÌËË Ì‡‰Ó ÔÂÂÔËÒ‡Ú¸ // HGE *hge = hgeCreate(HGE_VERSION); GLuint tex = TextureLoad((fullFileName.substr(0, fullFileName.length() - 3) + "png").c_str(), width, height); if (tex == 0) { // ÂÒÎË ÚÂÍÒÚÛ‡ Ì ̇ȉÂ̇ - ÔÂ˚‚‡ÂÏ Á‡„ÛÁÍÛ, ‚ÓÁ‚‡˘‡ÂÏ "false" return false; } // ÍÓ̈ ·ÎÓ͇ TiXmlDocument doc; if (doc.LoadFile(path)) { // ÂÒÎË Ù‡ÈÎ ÒÛ˘ÂÒÚ‚ÛÂÚ - ˜ËÚ‡ÂÏ XML Ò ÓÔËÒ‡ÌËÂÏ ‡ÌËχˆËÈ TiXmlElement *root = doc.RootElement(); TiXmlElement *animation = root->FirstChildElement("Animation"); while (animation) { const char *id = animation->Attribute("id"); // ¬Õ»Ã¿Õ»≈ - ËÁ ‰‚Ûı Ë ·ÓΠ‡ÌËχˆËÈ Ò Ó‰Ë̇ÍÓ‚˚ÏË id - ·Û‰ÂÚ Á‡„ÛÊÂ̇ ÚÓθÍÓ ÔÂ‚‡ˇ if (_animations.find(id) == _animations.end()) { _animations[id] = new Animation(animation, tex, width, height); } animation = animation->NextSiblingElement("Animation"); } _textures.push_back(tex); printf("file loaded %s\n", path); return true; } else { // Ù‡ÈÎ ‡ÌËχˆËÈ Ì ̇ȉÂÌ ËÎË Â„Ó Ì ۉ‡ÎÓÒ¸ ÔÓ˜ËÚ‡Ú¸ // ‚˚„ÛʇÂÏ ÚÂÍÒÚÛÛ, ‚ÓÁ‚‡˘‡ÂÏ "false" // // ̇˜‡ÎÓ ·ÎÓ͇ - ˝ÚÓÚ ÍÓ‰ ÔË ÔÓÚËÓ‚‡ÌËË Ì‡‰Ó ÔÂÂÔËÒ‡Ú¸ //hge->Texture_Free(tex); // ÍÓ̈ ·ÎÓ͇ printf("file not found: %s\n", path); return false; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值