Поток данных памяти для однородных переменных? - PullRequest
0 голосов
/ 23 февраля 2019

Когда текстура (2D) подается в шейдер в качестве «равномерного» ввода, она сначала загружается в OpenGL с помощью glTexImage2D (), а затем с помощью glUniform1i () связывается с шейдерной униформой.

например, код:

Данные текстуры

glTexImage2D(): используется для передачи данных текстуры на сторону сервера.

glGetUniformLocation(): используетсячтобы получить доступ к унифицированному дескриптору шейдера.

glUniform1i(): связывает данные, указанные единицей текстуры, с «унифицированным» входом шейдера.

, но когда мы передаем матрицу (например, matrix4x4) шейдеру как«равномерный» ввод, когда не используется какая-либо конкретная функция для загрузки его в OpenGL.Мы просто использовали glUniform .. (), чтобы связать данные с входом шейдера, который мы также использовали в случае связывания текстурных данных, которые уже присутствуют в памяти OpenGL.

Матричные данные

glGetUniformLocation(): для доступа к унифицированной ручке шейдера

glUniformMatrix4fv(): для привязки данных матрицы к унифицированному входу шейдера.

Где хранятся данные матрицыкаждый шаг в процессе передачи его в шейдер в качестве унифицированного ввода?

  • Всегда ли матричные данные хранятся в памяти на стороне клиента / ЦП и извлекаются каждый кадр на стороне сервера?

  • Если он загружен в OpenGL:

    • какой шаг / вызов функции загружает данные?

    • где хранятся данные в памяти OpenGL?

    • как указывается место в памяти?

1 Ответ

0 голосов
/ 23 февраля 2019

связывает данные, указываемые единицами текстуры, с «единообразным» входом шейдера.

Нет, это устанавливает «значение» равномерной переменной (uniform s не »)входные данные ") будут индексом единицы текстуры, где сэмплер может найти текстуру, которую представляет эта формаЗначение это просто значение;оно ничем не отличается от того, как вы устанавливаете значение любой универсальной переменной.

Просто в GLSL вы не получаете доступа к "значению" универсальной переменной сэмплера;вместо этого вы используете функции доступа к текстурам.

Если вы измените текстуру, привязанную к этой единице текстуры, перед рендерингом с помощью шейдера, шейдер увидит новую текстуру.Это не связано напрямую с какой-либо текстурой;шейдер связан только с индексом единицы текстуры.

Где матричные данные находятся на каждом шаге в процессе передачи их в шейдер в качестве единого входа?

В "процессе" передачи шейдеров есть только один шаг.Вы делаете glUniform* вызов, и «процесс» завершен;конкретная форма теперь имеет это конкретное значение.

Это ничем не отличается от установки практически любого состояния в OpenGL.Если вы делаете вызов glTexParameter, который выполняет «процесс» установки значения состояния, которое вы передаете в нужное место в объекте текстуры OpenGL.

Всегда ли матричные данные живут на стороне клиента /Доступна ли память ЦП и извлекается каждый кадр на стороне сервера?

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

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