Я пишу вершинный шейдер GLSL для iMac с видеокартой AMD Radeon HD 6970M 2048 МБ:
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 max значения неверны. Это фактическое количество компонентов, деленное на 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;
}