2016-04-14 3 views
1

Я пытаюсь передать массив точечных огней из класса объектов в вершинный шейдер в OpenGL ES 2.0 на Android.Как передать массив float в Shader в OpenGL ES 2.0?

Точечные огни хранятся как массив float[], и шейдер идеально почитает поплавки как массив vec4[].

Поплавок [] может быть передан в вершинный шейдер, вызвав glUniform4fv(...floatArray, 0) и объявлен в вершинном шейдере как uniform vec4 u_PointLights[990], но это очень медленно.

Я пытаюсь получить поплавки в память GPU; первая мысль была VBO, но после привязки данных и передачи ее в шейдер, я могу читать только один vec4, а не массив (т. е. не может объявить attribute vec4[] a_PointLights).

Каков наилучший способ получить второй vec4[] в шейдер?

Спасибо,

Ричард

+1

Какая часть этого чрезвычайно медленная, передача в форму шейдера или только фактический рендеринг? У вас может быть некоторое замедление в вашем шейдере, если theres большой сложный для циклов и операторов if (разветвление SLOW в шейдерах) Если не удается создать однородный буферный объект для переноса больших массивов, но я не думаю, что это должно быть слишком медленно отправляя массив в униформу. – WearyWanderer

+0

Я не думаю, что единые объекты буфера доступны на ES 2, к сожалению, хотя они поступают с ES 3. Но второй вопрос о самих шейдерах: как вы обрабатываете данные? В шейдерах желательно избегать условности и произвольного доступа; атаковать одного, как обычная императивная программа, обычно не приводит к хорошим результатам. – Tommy

+0

Также, как часто вы называете 'glUniform4fv'? Один раз за кадр? – Tommy

ответ

1

В OpenGL ES 2.0 вы не можете делать ничего другого на самом деле - либо на стороне клиента формы или атрибуты, оба из которых будут несколько ограничены.

В OpenGL ES 3.0 вы можете использовать Uniform Buffer Object, но обратите внимание, что очень большие массивы униформы всегда будут относительно дорогими, особенно на мобильных устройствах.

+0

Спасибо Isogen. Если собственный буфер недоступен в 2.0, как бы производительность передачи значений через карту текстуры сравнима с использованием float [] униформ через glUniform4fv? –

+0

Не все графические процессоры OpenGL ES 2.0 поддерживают текстурирование вершинного шейдера - в спецификации это не требуется, хотя это обязательно в ES 3.0. Производительность должна быть в порядке, если она доступна, но вам придется упаковать данные в цветовой формат и собрать значение (опять же, ES 3.0 будет иметь собственные текстуры loat, но ES 2.0 этого не делает). – solidpixel

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