2013-12-10 2 views
0

Предполагая, что я хочу рендерить квадрациклы и повторно использовать свою сетку, я хотел бы иметь возможность в одном призыве рисовать много примеров.Буфер текстуры OpenGL - Синтаксис GLSL

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

Я понимаю, как настроить объект буфера текстуры в C++, но я смущен тем, как захватить мои преобразования из этого в GLSL.

uniform samplerBuffer sampler; 
... 
... = texelFetch(sampler, index); 

В приведенном выше коде (в вершинном шейдере) я не уверен, как работает samplerBuffer ключевое слово (и было много проблем с поиском документации). Я хотел бы знать, какой индекс в буфере текстуры связан с данной вершиной, таким образом может произойти поиск преобразования. Как я могу это сделать, и как выглядит синтаксис GLSL?

Можно предположить, что матрицы преобразования являются матрицами 4х4. Я надеялся сохранить требования к версии OpenGL в диапазоне 2.XX.

Редактировать: Я нашел это: http://www.opengl.org/registry/specs/ARB/draw_instanced.txt. Я могу справиться с ограничением 3.0. Однако я смущаюсь при поиске примеров того, как это использовать. Используя GLEW, я полагаю, что я бы назвал glDrawElementsInstanced, но некоторые места в Интернете говорят, что для этого требуется OpenGL версии 3.3 или новее. Как я могу использовать требования 3.0, которые я связывал?

+0

Вы также можете использовать равномерные буферы, которые гораздо более подходят для загрузки нескольких векторных и матричных блоков. –

ответ

3

Ну, буферная текстура по существу представляет собой 1D массив данных, хранящихся в хранилище данных буфера (TEXTURE_BUFFER). Вы предоставляете единственное целое число, которое по существу является смещением в буфере и извлекает один тексель с texelFetch, начиная с этого смещения. Смещение всегда относится к текселю, а не к одному компоненту (например, R -компонент vec4) текселя. Поэтому, если вы настроите текстуру буфера с внутренним форматом GL_R, вы увидите один тексель, который хранит только одно значение, однако если вы используете GL_RGBA, то тексель будет состоять из четырех компонентов.

Например, предположит, что вы решили поставить два нормированных цветовые векторы с RGBA компонентов в хранилище данных, выберите внутренний формат GL_RGBA и индекс с 0 и 1, вы получите первые и вторые тексели из буфера текстуры , в соответствии с разделом 8.9 из ядра OpenGL 4.4 спецификации:

[..] хранилище данных подсоединенного буферного объекта интерпретируется как массив элементов типа данных GL, соответствующий internalformat. Каждый тексель состоит из одного-четырех элементов, которые отображаются на компоненты текстуры (R, G, B и A).

Обратите внимание, что texelFetchбудет всегда вернуть gvec4, то есть, ivec4, uivec4 или vec4 в зависимости от внутреннего формата. Если выбран внутренний формат, который определяет менее четырех компонентов, например GL_R32F, результат будет ненормализованное (< - это важно!) vec4(R, 0, 0, 1) - остальные GB компоненты установлены на нуль и A к 1. См таблицу 8.15 вышеупомянутой спецификации для полного обзора.

Также обратите внимание, что texelFetch не выполняет фильтрацию или зажим LOD.

+0

Большое спасибо за ответ. Я также сделал небольшое редактирование моего вопроса внизу, возможно, вы могли бы помочь с этим? Я просто смущен относительно требований к версии. – RandyGaul

+2

Реализованный рендеринг стал основным в GL 3.1, поэтому все, что связано с этой функциональностью, включая соответствующие призывы рисования, должно поддерживаться реализацией GL 3.1. Если вы застряли в GL 3.0, вы все равно можете проверить наличие «GL_ARB_draw_instanced» и просто использовать версию ARB. Если вы хотите точно знать, что нового в версии GL, проверьте соответствующее приложение - для GL3 это приложения F через I в основной спецификации GL 3.3. – thokra

2

Все версии texelFetch возвращают gvec4, поэтому я предполагаю, что вы должны выполнить 4 поиска, по 1 для каждой строки. Но это зависит от того, как вы закодировали свою матрицу.

uniform samplerBuffer sampler; 
... 
mat4 transform(texelFetch(sampler, RowIndex0), texelFetch(sampler, RowIndex1), texelFetch(sampler, RowIndex2), texelFetch(sampler, RowIndex3)); 

Имейте в виду, что mat4 в GLSL принимает столбцы в конструкторе, так что вам нужно перенести, что, если вы работаете с матрицами на основе столбцов.

+0

Хотел бы я ответить на оба ответа! Пришлось выбрать другой, потому что у него была немного более полезная информация о форматах данных. Спасибо, в любом случае, я поддержал :) – RandyGaul

+1

@RandyGaul: Я дал ему верхнюю часть, поэтому разница составляет всего 5 реп. ;) – thokra

Смежные вопросы