首先,我将一个对象的网格上传到一个 VAO (我知道如何做),并在没有引入新网格的每一帧中重用该数据。
然后,我想使用顶点着色器来并行旋转和平移许多顶点到它们的真实的位置,方法是为代表其自身连续对象的每组数据向GPU提供位置向量和旋转四元数。
我不知道如何在不将位置和旋转数据统一上传到Shader的情况下完成第二部分,这需要对每个相邻对象进行绘制调用,我猜这真的很低效。
有没有办法上传一系列的位置和旋转,并告诉OpenGL通过它们来转换 VAO 的某些部分?
我试着找了一整天的答案,但目前的文档对我来说有点混乱。
这是我的Shader输入的样子:
layout (location=0) in vec3 aPos;
layout (location=1) in vec4 aColor;
uniform mat4 uProjection;
uniform mat4 uView;
我在想,如果有某种形式的“统一”上传,在GPU处理时只被一系列顶点使用,那就太好了,但我不确定。
1条答案
按热度按时间8dtrkrch1#
这听起来像是你想要每个“对象”的一些数据,而不是对象中的每个顶点?您可以使用glVertexAttribDivisor和glDrawArraysInstanced实现此操作
它可能看起来像这样:
1.创建并绑定一个 VAO (glGenVertexArray,glBindVertexArray)
1.创建并绑定包含顶点的VBO(glGenBuffers、glBindBuffer、glVertexAttribPointer、glEnableVertexAttribArray、glBufferData)
1.创建并绑定一个VBO,其中包含每个对象/示例所需的数据(与上面相同,加上glVertexAttribDivisor)
你应该调用glDrawArraysInstanced而不是glDrawArrays。