我正在为一台带有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...
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;
}
mat4
数组会发生什么? - Nicol Bolas