Могу ли я использовать glUniform4fv для установки отдельного столбца матрицы шейдера? - PullRequest
1 голос
/ 10 июня 2019

Можно ли получить местоположение отдельного столбца glsl mat4?Я хочу обновить значение отдельного столбца матрицы, определенной в шейдере, фактически не задавая униформу всей матрицы.

У меня есть игра, в которой ориентация камеры часто остается неизменной, но часть перевода изменяетсячасто.Моя идея состояла в том, чтобы обновить только измененную часть перевода матрицы VP (проекция * вид), чтобы снизить производительность.

Ответы [ 3 ]

3 голосов
/ 10 июня 2019

Вы не можете. Вы не можете больше установить только один столбец матричной униформы, чем вы можете установить старшие два байта uint униформы, не устанавливая также и другие два байта. Когда дело доходит до униформ, матрицы являются таким же базовым типом, как вектор или скаляр.

Моя идея состояла в том, чтобы обновить только часть перевода матрицы представления, чтобы снизить производительность.

Это не сделает этого. Производительность выполнения очень маленькой передачи памяти между процессором и графическим процессором будет зависеть от затрат на выполнение любой передачи от процессора к графическому процессору. Таким образом, стоимость передачи 16 байтов будет в основном идентична стоимости передачи 64 байтов. Объем передаваемых данных становится значительным только для стоимости передачи, когда эта сумма начинает увеличиваться (килобайт / мегабайт).

Так что это пустая трата времени. Просто перенесите матрицу и двигайтесь дальше. Преждевременная оптимизация - корень всего зла.

3 голосов
/ 10 июня 2019

Можно ли получить местоположение отдельного столбца glsl mat4?

номер

Для универсального типа переменной mat необходимо использовать соответствующий вызов glUnfiformMatrix...(), и вы не можете обновить отдельные его части:

Возможные альтернативы:

  • Используйте Объект Uniform Buffer , где вы можете индивидуально контролировать каждый байт, как уже предложено в комментарии @ Rabbid76.
  • Используйте uniform vec4 mymat[4] вместо mat4 и создайте матрицу в шейдере (при необходимости) или напрямую используйте отдельные векторы столбцов для расчетов.
0 голосов
/ 10 июня 2019

нет, ты не можешь.как правило, вам не нужно делать это, потому что современные аппаратные средства делают этот тип передачи cpu в gpu так быстро, что нет никакой разумной разницы между отправкой столбца или всей матрицы.но в моем случае (во встроенных системах, использующих OpenGLES) я получил узкое место в аналогичной ситуации.поэтому я меняю форму на атрибуты.каждая строка матрицы станет атрибутом vec4, и мы используем VBO для отправки данных.частое изменение данных будет достигаться потоковой передачей буфера .Я не говорю, что это хороший способ и увеличит производительность (аппаратные средства различны), но в моем случае все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...