我正在为带有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
在我的着色器中,我想要一大堆均匀的mat4s:
uniform mat4 T[65]
但如果我尝试将65个这样的着色器(秘密地)切换到Apple Software Renderer模式。如果我改为使用64:
uniform mat4 T[64]
一切都很好。
似乎是超出最大制服数量的问题。但正如我上面写的那样,GL_MAX_VERTEX_UNIFORM_COMPONENTS为4096 /(4 * 4)= 256而不是64 ...
ATI / AMD注意:ATI最大组件值错误。它们是实际的组件数除以4。
但是读到这个我会认为如果我查询GL_MAX_VERTEX_UNIFORM_COMPONENTS并获得4096,那我实际上有16,384。似乎是这样的情况是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;
}
答案 0 :(得分:7)
你是对的,你需要将4096除以4而不是乘法。 wiki条目 措辞严厉。