ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分享一篇gamedev的关于opengl绘制数据组织的文章

2021-04-24 11:04:05  阅读:209  来源: 互联网

标签:... opengl vbo merge gamedev GPU 数据组织 绘制


       在opengl red book中,我们知道glDrawArray和glDrawElements这些drawcall可以绘制点集合GL_POINTS,线段集合GL_LINES, 和三角形集合GL_TRIANGLES这些代数拓扑中的单纯形,这些是3D的最基本的"砖块",其他复杂的曲面曲线都是通过离散成线段集合,三角形集合通过opengl的drawcall来绘制的。

       现在我们通过书上的讲解可以知道,如果要绘制n个曲面物体,例如[ball0,   ball1,  ball2, ...  balli, balln], 假设这n个ball,不一样我们必须每个物体创建一个VBO,然后调用n次glDrawElements,就像下面的伪代码描述

ballmeshs = {ball0, ball1,ball2,...balln}

for (int i = 0; i < n i++)
{
    GLuint vbo;
    glGenBuffer(vbo);
    glBindBuffer(..., vbo);
    glBufferData(...,vbo, trimesh);
    ...
    glDrawElements(...);
}

上面不是完整的opengl程序,只是说明性的,这样的绘制方式,主要的问题是这些API调用属于系统调用是有几十纳秒到几毫秒不等的,所以当n到了一定的数量,这个for里面的时间花费那是可观的,例如5秒是5000毫秒,几千个ball就能慢到秒级。

      所以现代GPU渲染方式,采用VBO这种方式,则要把n个曲面物体放到整个三角形集合中,构造一个vbo,代码组织方式如下

ballmeshs = {ball0, ball1,ball2,...balln}

// merge or (batch)n small mesh as one larger mesh
trimesh = merge(ballmeshs);


GLuint vbo;
glGenBuffer(vbo);
glBindBuffer(..., vbo);
glBufferData(...,vbo, trimesh);
...
glDrawElements(...);

这个merge函数是自己写的组织合并小的三角形mesh到一个大的三角形mesh,它也有时间花销,但是他的操作主要是内存操作,相比n个opengl的API及n个opengl的drawcall,反而是很快的了,当然CPU越快,merge就更快。

     这里有个平衡的问题,就是如果n很大,全都merge成一个vbo,opengl由GPU制造商限制,vbo有个最大容量的,超过了有的显卡就报错,而且一个vbo,如果想删除这个vbo中的部分ball,其实是在内存块删除操作,会有时间花费,会慢,这样vbo就不能太大,一些经验值是推荐的,网上有相关介绍,可能像OGL红宝书只是编程指南,一般介绍不多,这里是推荐一篇gamedev的文章 https://www.gamedev.net/tutorials/_/technical/opengl/opengl-batch-rendering-r3900/  这种就是给了个opengl的组织绘制数据的opengl代码,网上很多博客转载的比较多,但是要opengl比较熟悉才行. 我不知道有什么文献叫这个称呼,其实现代shader为主的GPU编程,主要的特点就是通过VBO, VAO, TBO给GPU一次喂更多的绘制数据,不然GPU一直喂不饱,浪费硬件,所以GPU叫批处理器是不是还更接近它的原理一些。

标签:...,opengl,vbo,merge,gamedev,GPU,数据组织,绘制
来源: https://www.cnblogs.com/abcstar/p/14696376.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有