Когда текстура (2D) передается шейдеру в качестве входных данных «uniform», она сначала загружается в OpenGL с помощью glTexImage2D(), а затем с помощью glUniform1i() она связывается с юниформой шейдера.
например код:
Текстурные данные
glTexImage2D(): используется для передачи данных текстуры на сервер.
glGetUniformLocation(): используется для доступа к универсальному дескриптору шейдера.
glUniform1i(): связывает данные, указанные текстурным блоком, с входными данными шейдера «uniform».
но когда мы передаем матрицу (например, matrix4x4) в шейдер как «унифицированный» ввод, когда не используйте какую-либо конкретную функцию для загрузки ее в OpenGL. Мы только что использовали glUniform..() для связывания данных с вводом шейдера, который мы также использовали в случае связывания данных текстуры, которые уже присутствуют в памяти OpenGL.
Данные матрицы
glGetUniformLocation(): для доступа к универсальному дескриптору шейдера
glUniformMatrix4fv(): связать данные матрицы с юниформ-вводом шейдера.
Где находятся матричные данные на каждом шаге в процессе их передачи шейдеру в качестве входных данных юниформ?
Всегда ли матричные данные находятся в доступной памяти на стороне клиента/ЦП и извлекаются каждый кадр на стороне сервера?
Если он загружен в OpenGL:
какой вызов шага/функции загружает данные?
где данные живут в памяти OpenGL?
как указано его место в памяти?





associates the data pointed by texture unit to the shader 'uniform' input.
Нет, это устанавливает «значение» юниформ-переменной (uniforms не являются «входными данными») как индекс текстурной единицы, где сэмплер может найти текстуру, которую представляет эта юниформа. Ценность — это просто ценность; это ничем не отличается от того, как вы устанавливаете значение юниформ-переменной любой.
Просто в GLSL вы не получаете доступ к «значению» юниформ-переменной сэмплера; вместо этого вы используете функции доступа к текстуре.
Если вы измените текстуру, привязанную к этому текстурному блоку, до рендеринга с помощью шейдера, то шейдер увидит новую текстуру. Он не связан напрямую с какой-либо текстурой; шейдер связан только с индексом блока текстуры.
Where does the matrix data live in each step in the process of passing it to a shader as a uniform input?
В «процессе» передачи юниформ-значений шейдерам есть только один шаг. Вы делаете glUniform* звонок, и «процесс» завершен; конкретная униформа теперь имеет эту особую ценность.
Это ничем не отличается от установки практически любого состояния в OpenGL. Если вы делаете вызов glTexParameter, который выполняет «процесс» установки значения состояния, которое вы передаете в нужное место в объекте текстуры OpenGL.
Does matrix data always live on client side/ CPU accessible memory and fetched every frame by server side?
Он живет везде, где реализация решит его поместить. Однако все функции OpenGL заканчиваются с указателями, которые вы им передаете, к тому времени, когда они возвращаются. Так что вам не нужно беспокоиться о памяти процессора ваш.
«Он живет там, где реализация решает его поместить. Однако все функции OpenGL завершаются с указателями, которые вы им передаете, к тому времени, когда они возвращаются». - если реализация решает хранить/сохранять данные на стороне клиента, может ли указатель OpenGL указывать на место в памяти процессора?
@ user2259784: Что такое «указатель OpenGL»? То, что делает реализация, это ее личное дело. Он может иметь указатели на память процессора и память графического процессора; только не в память, принадлежащую ты.
Значения юниформ-переменных «жизнь» в хранилище данных стандартного юниформ-блока на GPU.