Я пытаюсь передать массив точечных огней из класса объектов в вершинный шейдер в 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[]
в шейдер?
Спасибо,
Ричард
Какая часть этого чрезвычайно медленная, передача в форму шейдера или только фактический рендеринг? У вас может быть некоторое замедление в вашем шейдере, если theres большой сложный для циклов и операторов if (разветвление SLOW в шейдерах) Если не удается создать однородный буферный объект для переноса больших массивов, но я не думаю, что это должно быть слишком медленно отправляя массив в униформу. – WearyWanderer
Я не думаю, что единые объекты буфера доступны на ES 2, к сожалению, хотя они поступают с ES 3. Но второй вопрос о самих шейдерах: как вы обрабатываете данные? В шейдерах желательно избегать условности и произвольного доступа; атаковать одного, как обычная императивная программа, обычно не приводит к хорошим результатам. – Tommy
Также, как часто вы называете 'glUniform4fv'? Один раз за кадр? – Tommy