Каково фактическое количество вершинных компонентов для шейдера GLSL на видеокарте ATI? - PullRequest
10 голосов
/ 21 декабря 2011

Я пишу вершинный шейдер 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, у меня на самом деле будет 16384. Кажется, что дело в том, что GL_MAX_VERTEX_UNIFORM_COMPONENTS возвращает фактическое количество компонентов , умноженное на 4. Это тогда даст 1024 / (4 * 4) = 64.

Кто-нибудь может это подтвердить?

Edit: Мой шейдер просто:

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

1 Ответ

7 голосов
/ 21 декабря 2011

Вы правы, потому что вам нужно разделить 4096 на 4, а не умножить.Запись вики is была сформулирована плохо.

...