Мой вопрос основан на этом ответе Повторно используемые/общие функции GLSL, общие константы (OpenGL ES 2.0)?
Если я могу создать общий шейдер, то где предел? Могу ли я написать в этом общем шейдере Uniform-переменные? Какое максимальное количество общих шейдеров я могу подключить к конкретному? Увеличить эту производительность?
Это рекомендуется? Кто-нибудь имеет опыт с этим?
Обновлено: в моей реализации OpenGL у меня есть несколько шейдеров, которые расширяют другие шейдеры. Можно ли без потери производительности избавиться от дублирующегося кода?
Пример
ShaderC расширяет ShaderB, расширяет ShaderA. Каждый из них загружает какие-то юниформ-переменные. Было бы хорошей практикой, если бы я создал commonShaderB.glsl и commonShaderA.glsl и присоединил их к программе из shaperC, чтобы избежать дублирования кода glsl?
Can I write in this common shader Uniform variables ?
да.
What is the max amount of common shaders that I can attach to on spezific one ?
Нет ограничений на количество шейдеров, которые вы можете присоединить к шейдерной программе. Однако существуют ограничения на количество инструкций, юниформ-переменных и атрибутов. Маловероятно, что вы достигнете какого-либо из этих ограничений с разумно разработанным шейдером.
Increase this Performance ?
Нет.
If I can create a Comon Shader where is the limit ? Is it recommend ? Anyone experience with this ?
Эти вопросы слишком общие или основаны на мнениях и выходят за рамки StackOverflow. Функциональность существует не просто так, поэтому используйте ее, когда это уместно.
Каждый шейдер должен объявить переменные, которые он собирается использовать. Несколько шейдеров, связанных с одной и той же программой, могут объявлять одни и те же переменные. Если вы хотите совместно использовать объявления переменных, вам нужен способ генерации кода, аналогичный препроцессору C++ (#include
). Однако стандартного способа сделать это нет.
Теперь я создал в общем шейдере методы vec3 getPosition() usw. Но похоже, что загружаются только юниформ-переменные из общего шейдера — не будет ли плохой практикой, если я напишу этот препроцессор самостоятельно? И собрать собранную часть?
Что вы подразумеваете под "загружаются только юниформ-переменные из общего шейдера"? Загрузил где? Если вы хотите использовать функции, определенные в другом шейдере, вы также должны объявить их в первом шейдере (без их определений). Самостоятельное написание препроцессора — неплохая практика. На самом деле, у вас все равно не так много вариантов.
Я использую "glGetUniformLocation(int,String):int", чтобы получить местоположение юниформ-переменных. Если я загружу два вершинных шейдера, эта функция вернет для юниформ-переменных из второго шейдера -1. В любом случае, я начинаю писать препроцессор, так что у меня больше не будет этой проблемы. Если я правильно понимаю концепцию, препроцессор объединяет несколько файлов в один файл. Этот файл будет скомпилирован openGL.
Похоже, вы используете glGetUniformLocation()
неправильно. Параметры на самом деле GLuint
и const GLchar*
, где первый параметр — это имя связанной программы (не одного шейдера).
Я использую java-версию из OpenGL, библиотеку под названием lwjgl. Да, но если я скомпилирую шейдеры и прикреплю их к программе. Я должен иметь возможность использовать эту функцию для получения единого местоположения из всех подключенных шейдеров, но я могу получить местоположения только из первого присоединенного вершинного и фрагментного шейдера.
Тогда я неправильно задаю вопрос. Как мне это заархивировать? Когда я пытаюсь скомпилировать специальный, я получаю следующее сообщение 0 (31): ошибка C1008: неопределенная переменная «позиция» 0 (36): ошибка C1008: неопределенная переменная «viewMatrix» 0 (38): ошибка C1008: неопределенная переменная «projectionMatrix». "0(46): ошибка C1008: неопределенная переменная "transformationMatrix"