我正在为带有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]
一切都好
似乎是一个问题,超过了最大数量的制服。但正如我上面写的,我得到4096 GL_MAX_VERTEX_UNIFORM_COMPONENTS所以4096/(4*4)= 256不是64…
OpenGL.org wiki说
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;
}
你是对的,你需要把4096除以4,而不是乘以。wiki条目is用词不当。