加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenGL 4向顶点缓冲区提供数据

发布时间:2020-12-16 09:59:49 所属栏目:百科 来源:网络整理
导读:我使用旧方法将数据提供给OpenGL中的顶点缓冲区 glGenBuffers(1,buffer);glBindBuffer(GL_ARRAY_BUFFER,buffer);glBufferData(GL_ARRAY_BUFFER,sizeof(pos),pos,GL_STATIC_DRAW);glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0);glEnableVertexAttribArray(
我使用旧方法将数据提供给OpenGL中的顶点缓冲区

glGenBuffers(1,buffer);
glBindBuffer(GL_ARRAY_BUFFER,buffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(pos),pos,GL_STATIC_DRAW);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0);
glEnableVertexAttribArray(1);

从OpenGL 4.3开始,出现了一种新的略微更清晰的方法来向顶点着色器提供数据

const GLfloat colors[] =
{
    1.0f,0.0f,1.0f,1.0f
};
glBindVertexBuffer(1,buffer,3 * sizeof(GLfloat));

glVertexAttribFormat(1,0);
glVertexAttribBinding(1,1);
glEnableVertexAttribArray(1);

但我找不到任何解释如何使用新方式提供数据的资源.我当然可以这样做

glBindBuffer(GL_ARRAY_BUFFER,sizeof(colors),colors,GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0); //i can do even so,and later I can use glBindVertexBuffer

但它看起来并不优雅.如果我不使用glBindBuffer并且只使用glBindVertexBuffer然后使用glBufferData,我将覆盖使用glBindBuffer绑定的缓冲区中的数据.
所以问题是:我可以以其他方式向顶点缓冲区提供数据,或者我应该总是使用glBindBuffer,glBufferData,然后才使用glBindVertexBuffer,glVertexBufferFormat,glVertexAttribFormat和glVertexAttribBinding.谢谢!

解决方法

从我从OpenGL 4.3规范中可以看出,您仍然需要将顶点缓冲区绑定到“常规”绑定点以便更新其数据:

glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferSubData(GL_ARRAY_BUFFER,offset,size,data);

这个问题在4.5规范中已经有效地解决了,引入了DSA函数,它允许你更新缓冲区数据而不首先将它绑定到插槽:

glNamedBufferSubData(buffer,data);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读