GLSL делится униформой среди программ # 130

Сейчас я пытаюсь понять, как я использую униформу между шейдерами в старом GLSL. Наклеивание «общего» перед униформой не составляло труда. Изменить: я знаю, что униформа - это одна программа. Примером этого может быть матрица-проекция-модель. Не хотелось бы устанавливать его для каждой программы индивидуально, а только один раз.

Есть способ сделать это?

Это код (вершинного) шейдера:

#version 130
in vec4 position;
in float size;
in vec4 incol;
out vec4 color;
shared uniform ivec4 relWorldOffset;
uniform vec4[14] cubestrip;
uint cubeindex;
void main()
{
  gl_Position = gl_ModelViewProjectionMatrix
   * (cubestrip[cubeindex] * size
   + relWorldOffset + position);
  cubeindex++;
  color = incol;
  cubeindex %= 14U;

Это ошибка:

0:6(1): error: syntax error, unexpected NEW_IDENTIFIER, expecting $end

person Banyoghurt    schedule 29.03.2014    source источник
comment
Под совместным использованием вы подразумеваете однократное объявление переменной и использование ее в разных шейдерах одного и того же вызова отрисовки?   -  person a.lasram    schedule 29.03.2014
comment
Хорошо, позвольте мне уточнить: совместное использование означает наличие одного и того же унифицированного объявления для разных вершинных шейдеров в разных программах. Менять нужно только в одной шейдерной программе.   -  person Banyoghurt    schedule 29.03.2014


Ответы (1)


В GLSL нет такого shared ключевого слова. Вероятно, вы ищете однородные блоки или однородные буферные объекты (UBO). Согласно OpenGL wiki, им требуется OpenGL версии 3.1 (поэтому требуется GLSL #version 140 или выше. ). Если это не проблема, синтаксис GLSL будет следующим:

uniform MatrixBlock
{
    mat4 projection;
    mat4 modelview;
};

Также ознакомьтесь с этим руководством и спецификация GLSL 1.40 (глава 4.3.5.1) для получения дополнительных указателей.

(РЕДАКТИРОВАТЬ: на самом деле ключевое слово shared определено в самых последних версиях OpenGL, но оно используется только в качестве квалификатора макета в вычислительных шейдерах, чтобы сделать переменную совместно используемой в рабочей группе.)

person Arttu Peltonen    schedule 29.03.2014
comment
Это была вещь! Мне пришлось добавить #extension GL_ARB_uniform_buffer_object: enable, потому что я использую оборудование Intel - person Banyoghurt; 29.03.2014
comment
@Banyoghurt: Не факт, что вы используете оборудование Intel, и вам нужно это делать. На самом деле это связано с тем, что объекты унифицированного буфера не определены в GLSL 1.30. Совместимый компилятор GLSL не позволит вам использовать их без директивы #extension ..., когда вы сообщите ему, что компилируете шейдер GLSL 1.30. Некоторые поставщики более соответствуют требованиям, чем другие, но это происходит не только из-за того, что вы используете оборудование Intel. - person Andon M. Coleman; 30.03.2014