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

在我的着色器中,我希望有大量统一的 mat4:

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;
}
4

1 回答 1

7

你是对的,你需要将 4096 除以 4 而不是相乘。wiki 条目措辞很糟糕。

于 2011-12-21T14:48:44.867 回答