Если вы просто хотите получить доступ к большому блоку памяти в шейдере, вы можете использовать текстуру буфера . Очевидно, что для этого требуется более поздняя версия GL (3.0 или выше), поэтому вам нужно аппаратное обеспечение DX10 или лучше.
Концепция довольно проста. Вы делаете буферный объект, который хранит ваши данные. Вы создаете текстуру буфера, используя типичную команду glGenTextures
, а затем glBindTexture
ее целевое значение GL_TEXTURE_BUFFER. Затем вы используете glTexBuffer
, чтобы связать ваш буферный объект с текстурой.
Теперь вы, похоже, хотите использовать 4 бита на воксель. Таким образом, ваш формат изображения должен быть одноканальным 8-битным целым форматом без знака. Ваш glTexBuffer
вызов должен быть примерно таким:
glTexBuffer(GL_TEXTURE_BUFFER, GL_RUI8, buffer);
где buffer
- буферный объект, в котором хранятся ваши данные вокселей.
Как только это будет сделано, вы можете изменить содержимое этого буферного объекта, используя обычные механизмы .
Вы привязываете буферную текстуру для рендеринга, как и любая другая текстура.
Вы используете usamplerBuffer
тип сэмплера в своем шейдере, потому что это беззнаковая целочисленная буферная текстура. Вы должны использовать команду texelFetch
для доступа к данным из нее, которая принимает целочисленные координаты текстуры и игнорирует фильтрацию. Что, конечно, именно то, что вы хотите.
Обратите внимание, что текстуры буфера имеют ограничения по размеру. Однако ограничения по размеру часто составляют большой процент видеопамяти.