OpenGL实例绘制了如何处理顶点输入限制

时间:2014-09-06 22:33:44

标签: c++ opengl matrix

我想对我的opengl引擎实现实例化渲染,但我刚刚了解到顶点着色器支持的最大输入数量仅为我的GPU。

这些是我需要转移到输入的以下矩阵:

uniform mat4 MVP;
uniform mat4 modelMatrix;
uniform mat3 normalMatrix;
uniform mat4 DepthBiasMVP;

如果我理解正确,我将需要每个矩阵的每列的属性,所以我需要4 + 4 + 3 + 4 = 15属性空间。 19我已经使用了属性(pos,color,texCoord,normal),如果我添加切线和其他东西,它将增长到20+。

有没有办法解决这个问题,还是我必须忘记实例化绘图?假设我设法摆脱了其中一个矩阵(modelMatrix),我有大约15-16个属性,它可以在不同的GPU上运行吗? 16限制是所有GPU的最小权限吗?

2 个答案:

答案 0 :(得分:1)

请注意,16是您的实现实际拥有的最小顶点属性数量;大多数情况下允许您通过以下方式查询:

glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &n).

现在,当您尝试将所有数据存储在实例化数组中时,您应该尝试组织您希望每个实例不同的数据。您是否有许多仅在位置和/或方向上有所不同的实例对象?然后你可能需要将uniform modelMatrix设置为实例数组(需要4个顶点属性,一个可接受的值)。你真的需要为每个实例提供不同的视图和投影矩阵吗?可能不是。同样适用于DepthBiasMVP

如果您执行非统一缩放,则需要normalMatrix,如果您计划为每个实例执行此操作,则还需要为每个实例设置normalMatrix。您可以事先在CPU上计算它们,并将它们作为顶点属性发送给您另外4个顶点属性。另一种选择是在顶点着色器中计算normalMatrix,但这可能会使您的顶点着色器减慢一点(可能是一个可接受的权衡?)。

这些应该将每个实例所需的信息减少到只有modelMatrixnormalMatrix,而且已经减少了一半。也许你每个实例只有不同的位置?在这种情况下,即使是简单的vec4也可以。

基本上,请尝试考虑一下实际需要更新每个实例的数据,并且您很可能会对每个实例实际需要多少数据感到惊讶。

答案 1 :(得分:0)

可以将每个实例数据存储在统一数组uniform buffer objectstexture buffer objects中,并使用GLSL中的gl_InstanceID变量来访问缓冲区对象中的数据。统一数组可能看起来最简单,但大小最受限制,因此仅适用于少量实例。 UBO可能会更大,但也非常有限。另一方面,TBO将允许您使用数兆字节的数据,但您必须在那里适当地打包数据。在您的情况下,似乎您只需要浮点类型,因此具有32位浮点数的基本格式就足够了。