opengl网格中的对setupmesh的理解

本文介绍了OpenGL ES中缓冲区对象的基本概念及其使用方法,包括glBufferData、glBindBuffer、glVertexAttribPointer等关键函数的功能及应用。通过具体实例说明了如何利用VBO、EBO、VAO进行数据管理,实现高效渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

glbufferdata()函数含义:就是把当前用户定义的数据 - 复制 - 到当前绑定缓冲。 用VBO管理。

glBindBuffer()把当前的索引复制到缓冲。 由EBO管理。

vertices.size() * sizeof(Vertex)就是把全部数据复制过来。

glVertexAtrribPointer()这个函数的作用呢?链接顶点属性,根据顶点属性位置、大小、第5个是步长,其他都是硬性属性。最后一个参数offset为偏移量,后面用到了。

glEnableVertexAttribArray()这个参数的012都是启用属性。

glBindVertexArray()用到这个的就是绑定VAO和解绑VAO-0。


GridLevel lvl; if(0 == level){ lvl.size = m_baseSize; lvl.divisions = m_baseSize; } else { // lvl.size = m_baseSize * pow(2, level); // lvl.divisions = 10 * pow(2, level); lvl.size = pow(2, m_baseSize); lvl.divisions = pow(2, m_baseSize); } qDebug() << __FUNCTION__ << lvl.size << lvl.divisions; // 创建单位网格线(将被实例化) std::vector<QVector2D> lines; lines.emplace_back(0.0f, 0.0f); lines.emplace_back(1.0f, 0.0f); lines.emplace_back(0.0f, 0.0f); lines.emplace_back(0.0f, 1.0f); // 实例位置(网格交叉点) std::vector<QVector3D> instances; float step = lvl.size / lvl.divisions; float halfSize = lvl.size * 0.5f; for (int i = 0; i <= lvl.divisions; ++i) { for (int j = 0; j <= lvl.divisions; ++j) { float x = -halfSize + i * step; float z = -halfSize + j * step; instances.emplace_back(x, 0.0f, z); } } lvl.lineCount = instances.size() * 2; // 创建VAO/VBO glGenVertexArrays(1, &lvl.vao); glGenBuffers(1, &lvl.vbo); glBindVertexArray(lvl.vao); // 顶点数据(单位线) GLuint lineVBO; glGenBuffers(1, &lineVBO); glBindBuffer(GL_ARRAY_BUFFER, lineVBO); glBufferData(GL_ARRAY_BUFFER, lines.size() * sizeof(QVector2D), lines.data(), GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(QVector2D), (void*)0); // 实例数据(位置) GLuint instanceVBO; glGenBuffers(1, &instanceVBO); glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); glBufferData(GL_ARRAY_BUFFER, instances.size() * sizeof(QVector3D), instances.data(), GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(QVector3D), (void*)0); glVertexAttribDivisor(1, 1); // 告诉OpenGL这是每个实例更新一次的数据 glBindVertexArray(0); m_levels.push_back(lvl); 优化一下,实例化动态分级网格
最新发布
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值