Открытые шейдеры GL «повторно использованы»

Мой вопрос основан на этом ответе Повторно используемые/общие функции GLSL, общие константы (OpenGL ES 2.0)?

Если я могу создать общий шейдер, то где предел? Могу ли я написать в этом общем шейдере Uniform-переменные? Какое максимальное количество общих шейдеров я могу подключить к конкретному? Увеличить эту производительность?

Это рекомендуется? Кто-нибудь имеет опыт с этим?

Обновлено: в моей реализации OpenGL у меня есть несколько шейдеров, которые расширяют другие шейдеры. Можно ли без потери производительности избавиться от дублирующегося кода?

Пример

ShaderC расширяет ShaderB, расширяет ShaderA. Каждый из них загружает какие-то юниформ-переменные. Было бы хорошей практикой, если бы я создал commonShaderB.glsl и commonShaderA.glsl и присоединил их к программе из shaperC, чтобы избежать дублирования кода glsl?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
293
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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. Функциональность существует не просто так, поэтому используйте ее, когда это уместно.

Тогда я неправильно задаю вопрос. Как мне это заархивировать? Когда я пытаюсь скомпилировать специальный, я получаю следующее сообщение 0 (31): ошибка C1008: неопределенная переменная «позиция» 0 (36): ошибка C1008: неопределенная переменная «viewMatrix» 0 (38): ошибка C1008: неопределенная переменная «projectionMatrix». "0(46): ошибка C1008: неопределенная переменная "transformationMatrix"

Meeresgott 24.07.2019 23:42

Каждый шейдер должен объявить переменные, которые он собирается использовать. Несколько шейдеров, связанных с одной и той же программой, могут объявлять одни и те же переменные. Если вы хотите совместно использовать объявления переменных, вам нужен способ генерации кода, аналогичный препроцессору C++ (#include). Однако стандартного способа сделать это нет.

Nico Schertler 24.07.2019 23:50

Теперь я создал в общем шейдере методы vec3 getPosition() usw. Но похоже, что загружаются только юниформ-переменные из общего шейдера — не будет ли плохой практикой, если я напишу этот препроцессор самостоятельно? И собрать собранную часть?

Meeresgott 25.07.2019 00:19

Что вы подразумеваете под "загружаются только юниформ-переменные из общего шейдера"? Загрузил где? Если вы хотите использовать функции, определенные в другом шейдере, вы также должны объявить их в первом шейдере (без их определений). Самостоятельное написание препроцессора — неплохая практика. На самом деле, у вас все равно не так много вариантов.

Nico Schertler 25.07.2019 01:36

Я использую "glGetUniformLocation(int,String):int", чтобы получить местоположение юниформ-переменных. Если я загружу два вершинных шейдера, эта функция вернет для юниформ-переменных из второго шейдера -1. В любом случае, я начинаю писать препроцессор, так что у меня больше не будет этой проблемы. Если я правильно понимаю концепцию, препроцессор объединяет несколько файлов в один файл. Этот файл будет скомпилирован openGL.

Meeresgott 25.07.2019 10:58

Похоже, вы используете glGetUniformLocation() неправильно. Параметры на самом деле GLuint и const GLchar*, где первый параметр — это имя связанной программы (не одного шейдера).

Nico Schertler 25.07.2019 17:34

Я использую java-версию из OpenGL, библиотеку под названием lwjgl. Да, но если я скомпилирую шейдеры и прикреплю их к программе. Я должен иметь возможность использовать эту функцию для получения единого местоположения из всех подключенных шейдеров, но я могу получить местоположения только из первого присоединенного вершинного и фрагментного шейдера.

Meeresgott 25.07.2019 20:49

Другие вопросы по теме