2015-07-30 10 views
0

Я делаю некоторые LBS, и мне нужно использовать более 4 весов и индексов (скажем, мне нужны значения 60 float и значения 60 int).Передача массива в вершинный шейдер как атрибут

Я использую GLSL version 1.30, поэтому я не могу использовать Shader Storage Buffer Object. Поскольку этот вес и информация индекса будут разными для каждой вершины, не могут использовать uniform, и я думаю, что нет способа определить массив с фиксированным размером (например, float arr[16]), если вы не используете uniform. Кроме того, для входов attribute я могу использовать только vec/mat2, 3 или 4.

Итак, вы хоть представляете, как я могу решить эту проблему?

+0

Значит, вам нужно 120 различных значений для каждой вершины? – dari

+0

Да, в худшем случае – ciyo

+1

Как вам может понадобиться 120 значений для каждой, вершины? Я имею в виду, почему? – Sung

ответ

2

Первым подходом было бы просто передать их как обычные атрибуты вершин. Существует хотя и конкретное максимальное количество атрибутов вершин.


Лучший подход, который должен работать с каждым водителем и с произвольным количеством атрибутов (не бесконечным, но довольно много) есть, чтобы сохранить вершину атрибутов в качестве текстуры.

Простой настройкой было бы создание текстуры NxM, где N = # vertex_attributes и M = # вершин. Каждая вершина имеет только один атрибут, который указывает линию текстуры. В вершинном шейдере вы можете читать одну строку текстуры на вершину и иметь все свои атрибуты.

+0

Спасибо, это хорошая идея. Но не могли бы вы дать мне немного больше информации о том, как я могу сгенерировать текстуру, и повторить ее в шейдере? – ciyo

+0

Создание текстуры можно выполнить с помощью следующих команд: 'glGenTextures (...), glTexImage2D (...)' Вы должны найти много учебника, как их использовать. Доступ к текстуре в шейдере можно выполнить с помощью 'texelFetch (...), texture (...)' еще раз, просто посмотрите основные учебные пособия по тексту. – dari