Войти
ДельфинарийСтатьи

Буферы данных в 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.

Страницы: 1 2 Следующая »

#Delphi, #расширения OpenGL, #OpenGL

21 апреля 2010 (Обновление: 22 апр. 2010)

Комментарии [9]