как я могу получить доступ к буферной памяти в вершинном шейдере с помощью openl-es 3.0?

Я слышал, как вершинный шейдер обращается к собственным данным буфера пользователя (объект буфера текстуры) с использованием OpenGL 3.x (с использованием метода TexelFetch)

Так что недавно я попытался применить технику TPB к вершинному шейдеру OpenglES 3.0 с IOS7, но я не мог использовать TBO bcz OpenGLES 3.0 не мог его предоставить.

Мой вершинный шейдер должен получить доступ к TBO и использовать его данные, такие как скорости, положения и силы.

Я хочу использовать симулятор TBO techinc на OpenglES 3.0.

Если я использую объект пиксельного буфера, могу ли я получить к ним доступ с помощью метода "texelFetch ()" шейдера?

Как я могу разобраться в своей работе? Кто-нибудь знает хороший способ?


person Lavendy    schedule 16.09.2014    source источник


Ответы (1)


Я не верю, что вы можете сэмплировать непосредственно из объекта пиксельного буфера.

Один очевидный вариант - использовать обычную текстуру вместо объекта буфера текстуры. Максимальный размер текстуры устройств iOS, совместимых с ES 3.0, составляет 4096 (источник: https://developer.apple.com/library/iOS/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html). В зависимости от размера ваших данных есть несколько подвариантов. n - количество текселей:

  • Если n не больше 4096, вы можете сохранить его в 2D-текстуре размером n x 1.
  • Если n больше 4096, вы можете сохранить его в 2D-текстуре размером 4096 x ((n + 4095) / 4096).

В обоих случаях вы все равно можете использовать texelFetch() для получения данных из текстуры. В первом случае вы выбираете (i, 0), чтобы получить значение i. Во втором случае вы выбираете (i % 4096, i / 4096).

Если у вас уже есть данные в буфере, вы можете сохранить в нем текстуру, привязав буфер как GL_PIXEL_UNPACK_BUFFER перед вызовом glTexImage2D(), который затем будет источником данных из буфера.

Другой вариант, который следует рассмотреть, - это объекты унифицированного буфера. Это позволяет связать содержимое буфера с единым блоком, который затем дает вам доступ к значениям в шейдере. Посмотрите glBindBuffer(), glBindBufferBase(), glBindBufferRange() с целью GL_UNIFORM_BUFFER для получения подробной информации. Максимальный размер унифицированного блока в байтах равен GL_MAX_UNIFORM_BLOCK_SIZE и составляет 16 384 на устройствах iOS / A7.

person Reto Koradi    schedule 17.09.2014