2015-08-01 3 views
0

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

Как связать другую текстуру для каждого квадрата? Возможно ли это при использовании функции glDrawRangeElements()? Если нет, какую другую функцию OpenGL я должен посмотреть?

ответ

2

Во-первых, вам необходимо предоставить доступ к нескольким текстурами внутри ваш фрагмент shader.To сделать это, вы можете использовать:

Arrays Textures 3D текстуры -в основном, где третье измерение является количество различных 2D текстуры layers.The ограничение состоит в том, что все текстуры в массиве должны быть одного размера. Также можно использовать текстуры Cube Map (GL 4.0 и более поздние) для складывания нескольких текстур.

Bindless textures - эти вы можете использовать только на относительно новом оборудовании. Для Nvidia это Kepler и later.Because без привязки текстуры, по существу, является указателем на текстурную память на GPU, вы можете заполнить массив или Uniform buffer тысячами таких, а затем индекс в этот массив в шейдере фрагмента, имеющий прямой доступ к объекту сэмплера.

Теперь, как вы можете индексировать эти массивы на примитив? Существует множество способов. Во-первых, вы можете использовать instanced drawing, если вы несколько раз визуализируете одни и те же примитивы. У вас есть идентификатор экземпляра GLSL для отслеживания того, какой примитив в настоящее время нарисован. В случае, если вы не используете instancing, а также пытаетесь текстурировать разные части геометрии в одном обратном вызове, это было бы более сложным. Вы должны добавить информацию индекса текстуры на основе каждой вершины. То есть, если ваша геометрия имеет чередующуюся структуру за vertex выглядит так:

VTN, VTN, VTN ... где (V-вершины, T-текстурные коорды, N-нормали), вы должны добавить еще один набор данных, назовем его I - (индекс текстуры) , поэтому ваш массив вершин будет иметь структуру VTNI, VTNI, VTNI ...
Вы также можете установить отдельный буфер Vertex, включающий только индексы текстуры. Но для больших буферов геометрии это, вероятно, будет менее эффективным. более быстрый доступ к данным. После этого вы можете передать этот индекс текстуры как изменяющийся в фрагментарный шейдер (установленный как плоский, чтобы убедиться, что он не интерполирован) и индексировать в определенную текстуру. Это означает, что ваш массив вершин будет больше и содержать избыточные данные, но это недостаток использования мультитекстуры на одном примитивном уровне.

Надеюсь, это поможет.

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

  • Нет связанных вопросов^_^