【问题标题】:How to send data from different buffers or arrays for rendering?如何从不同的缓冲区或数组发送数据进行渲染?
【发布时间】:2016-04-30 00:38:09
【问题描述】:

我知道这是一个非常基本的问题,但我有顶点数组和纹理坐标以及相应的缓冲区:

glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*Loader.verticesFixed.size(),&Loader.verticesFixed[0],GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,texturebuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*Loader.texturesFixed.size(),&Loader.texturesFixed[0],GL_STATIC_DRAW);

我想知道如何发送数据进行渲染。

我知道我可以合并顶点和纹理数组,这样我就有一个数组,它有 x1,y1,z1,u1,v1,x2,y2,z2,u2,v2... 然后为这个数组创建缓冲区,绑定它并使用具有特定步幅和偏移量的 glVertexAttribPointer 以及属性 0 和 1 用于顶点和纹理坐标以及 glDrawArrays。但是我想知道是否可以在不合并数组的情况下从多个缓冲区发送数据。

我之所以问这个问题是因为我想将纹理添加到 3d 模型,如果我正确理解所有内容以有效地执行此操作,我需要使用具有不同索引(位置)的 glVertexAttribPointer 以及统一纹理将数据发送到着色器。

【问题讨论】:

  • 您是在问如何将两个非交错数据数组上传到交错数据的 OpenGL 缓冲区中?您必须自己进行交错,或者在您自己的缓冲区上使用glBufferData 或通过glMapBuffer'ing GL 缓冲区。
  • "我需要使用具有不同索引(位置)和统一纹理的 glVertexAttribPointer 将数据发送到着色器。" “不同索引”是什么意思?您的意思是对位置使用索引列表,对纹理坐标使用单独的索引列表吗?

标签: opengl


【解决方案1】:

我猜你想像这样发送你的数据:x1,y1,z1,x2,y2,z2....u1,v1,u2,v2... 我实际上不知道这是否可能,但我认为无论如何它都会相当低效。当你有你的数据交错时,你在一个地方拥有一个顶点所需的一切,你有位置,在它旁边你有纹理信息,你不必“跳转”来找到纹理坐标。我不知道openGL是否真的这样工作,这只是一个假设。

但是,对于将纹理信息发送到着色器,使用“正常交错”方式就可以了。然后你必须将你的纹理与 glBindTexture(GL_TEXTURE_2D,texture_id); 在让你调用之前。

在顶点着色器中,您将访问顶点的纹理位置,就像您使用 layout (location = 1) in vec2 TexCoord; 访问位置信息一样

例如,如果您的数据排列为x1,y1,z1,u1,v1,x2,y2...,那么您在调用时自己设置“位置” glVertexAttribPointer(location,2,GL_FLOAT,GL_FALSE,stride,(GLvoid*)(3*sizeof(GLfloat))); glEnableVertexAttribArray(location);

我希望我澄清了一些事情。如果您不熟悉 OpenGL 或一般 OpenGL 中的纹理,我推荐http://learnopengl.com/#!Getting-started/Textures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2012-03-06
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多