Буферы данных в OpenGL через расширения texture_buffer_object и uniform_buffer_object
Автор: Александр Киселёв
На сегодняшний день GPU обладают памятью такого же объёма (если не большего), что и оперативная память на ПК. Поэтому сейчас есть возможность хранить больше данных в памяти непосредственно на GPU, чем можно было ранее. OpenGL 3 дал возможность использовать расширения, позволяющие хранить, к примеру, большую информацию о геометрии. С выходом новой версии этого API расширения texture_buffer_object и uniform_buffer_object стали чуть ли не основными способами хранения данных.
Texture Buffers
Дополнительная информация
Uniform Buffers
Дополнительная информация
Ссылки
Texture Buffers
Текстурные буферы стали доступны в OpenGL 3.1 через расширение GL_ARB_texture_buffer_object (ранее доступные через расширение GL_EXT_texture_buffer_object). Данная технология позволяет считывать в вершинном шейдере данные из буфера, используя тексели текстуры как ячейки хранения данных. Поэтому, чтобы использовать такой буфер, нужно преобразовать его в формат текстуры. И для большей эффективности лучше использовать все 4 компонента текстуры.
Ниже приведён абстрактный пример заполнения буфера данных для использования TextureBuffers.
var Data: array [0..(VertexCount – 1)] of TVec4f; begin //… glGenBuffers( 1, @FTexBuffer); glBindBuffer( GL_TEXTURE_BUFFER, FTexBuffer); glBufferData( GL_TEXTURE_BUFFER, VertexCount * SizeOf( TVec4f), @Data[0], GL_STREAM_DRAW); glGenTextures( 1, @FBuffer); glBindTexture( GL_TEXTURE_BUFFER, FBuffer); glPixelStorei( GL_UNPACK_ALIGNMENT, 1); glTexBuffer( GL_TEXTURE_BUFFER, GL_RGBA32F, FTexBuffer); glBindBuffer( GL_TEXTURE_BUFFER, 0); glBindTexture( GL_TEXTURE_BUFFER, 0); end;
Далее текстурный буфер используется как обычная текстура.
glActiveTexture(GL_TEXTURE0 + Channel); glBindTexture( GL_TEXTURE_BUFFER, FBuffer);
Для получения конкретных данных нам нужно использовать смещения от начала массива данных. Эти смещения можно записывать в вершинный буфер данных (или буфер индексов), или же передавать в качестве вершинных атрибутов.
Пример чтения данных из подобного буфера данных.
#version 150 precision highp float; precision highp int; uniform mat4 MatrixViewProjection; uniform samplerBuffer VertexSampler0; in float ID; void main(void) { int offset = int( ID); vec4 inVertex = texelFetch( VertexSampler0, offset); gl_Position = MatrixViewProjection * inVertex; }
Дополнительная информация
Максимальный объём: 128Мб (или более).
Максимальный объём в байтах можно получить используя константу
GL_MAX_TEXTURE_BUFFER_SIZE = $8C2B;
Метод доступа: произвольный доступ.
Используемая память: локальный тип памяти.
Данное расширение удобно использовать для передачи вершинных атрибутов в шейдер без постоянного отправления в память GPU. Например, использование в статичной геометрии, где обновление данных минимально. В противном случае лучше подойдёт Uniform Buffer.
#Delphi, #расширения OpenGL, #OpenGL
21 апреля 2010 (Обновление: 22 апр 2010)
Комментарии [9]