2016-04-30 83 views
0

我知道这是很基本的问题,但我有个顶点和纹理坐标和对应的缓冲器的阵列:如何从不同的缓冲区或数组发送数据进行渲染?

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。但是,我想知道是否有可能从多个缓冲区发送数据而不合并数组。

我在问这个,因为我想添加纹理到三维模型,如果我正确地理解了一切,有效地做到这一点,我需要发送数据着色器使用glVertexAttribPointer与不同的指数(位置)一起纹理一致。

+1

您是否在问如何将两个非交叉数据数组上传到交织数据的OpenGL缓冲区?你必须自己完成交错,或者在你自己的缓冲区中用'glBufferData'或者'GLMapBuffer'处理GL缓冲区。 –

+1

“*我需要使用具有不同索引(位置)和统一纹理的glVertexAttribPointer将数据发送到着色器。*”您指的是什么“不同的索引”?你的意思是使用位置索引列表和纹理坐标单独的索引列表吗? –

回答

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

相关问题