ATI显卡上GLSL着色器的顶点uniform组件实际数量是多少?

11

我正在为一台带有AMD Radeon HD 6970M 2048 MB显卡的iMac编写GLSL顶点着色器:

GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20

在我的着色器中,我希望有一个大型的uniform mat4s数组:
uniform mat4 T[65]

但是如果我尝试使用65个这样的着色器,我的着色器(秘密地)切换到苹果软件渲染器模式。如果我改为使用64个,则不会出现此问题:

uniform mat4 T[64]

一切正常。

似乎存在超过最大uniform数量的问题。但是如上所述,我得到GL_MAX_VERTEX_UNIFORM_COMPONENTS的值为4096,因此4096 /(4 * 4)= 256而不是64...

OpenGL.org wiki说:

ATI/AMD注意:ATI的最大组件值是错误的。它们是实际组件数除以4得到的。

但是阅读此内容后,我认为如果我查询GL_MAX_VERTEX_UNIFORM_COMPONENTS并获得4096,则实际上我有16384。似乎情况是GL_MAX_VERTEX_UNIFORM_COMPONENTS返回实际组件数乘以 4。然后这将给出1024 /(4 * 4)= 64。

有人可以证实这一点吗?

编辑: 我的着色器很简单:

#version 120

// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];

void main()
{
  gl_Position =  T[int(indices[0])]*gl_Vertex;
}

3
请问您能否发布您的着色器代码,或至少提供所有使用的uniform变量的定义?并且您是正确的,需要将1024除以4而不是乘以4。Wiki条目表述得不太清楚。 - datenwolf
我在上面发布了着色器代码(我还注意到在我的计数中有一个错误,所以我编辑了原始问题中的数字63->64和64->65)。 - Alec Jacobson
1
@datenwolf,你应该将这个作为答案发布,因为这显然是他的问题。我猜他只是使用了一些其他的小型uniforms,“阻塞”了最后64个矩阵插槽(内置的uniforms也算在内,我想)。 - Christian Rau
我很好奇:如果你创建了两个长度为33的mat4数组会发生什么? - Nicol Bolas
@Nicol 33不起作用,因为最终结果是66。另一方面,32可以正常工作。 - Alec Jacobson
1个回答

7

你是对的,isofar。你需要将4096除以4而不是乘以4。维基百科的词条措辞不太准确。


6
这段话的意思是:它并不是用词不当,再看一遍。也不要查看该页面的编辑历史记录;我确定写这篇文章的人在看到这个问答后并没有对其进行修改。不,几分钟前肯定没有这样的事情发生。;) - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接