#android #opengl-es #opengl-es-2.0
#Android #opengl-es #opengl-es-2.0
Вопрос:
я работаю над шейдерами OpenGL ES 2.0 на Android…
у меня есть массив с плавающей точкой с положением вершин вместе с другими атрибутами вершин. позиция и другие атрибуты могут меняться со временем.
как я могу передать этот измененный массив в glVertexAttribPointer, чтобы я мог нарисовать сцену с обновленными значениями
когда я попытался передать его, я получил
Метод glVertexAttribPointer(int, int, int, boolean, int, Buffer) типа GLES20 неприменим для аргументов (int, int, int, boolean, int, float[])
Комментарии:
1. Ошибка сообщает вам, что вам нужно взять тот массив вершин с плавающей точкой, который у вас есть, и каким-то образом преобразовать его в объект buffer. Я не эксперт по OpenGL, так что это все, что я могу ответить на этот вопрос.
2. спасибо, Эрик, но я не могу изменить буфер… итак, хотите использовать массивы вместо
Ответ №1:
FloatBuffer yourFloatBuffer;
float[] yourFloatArray;
FloatBuffer byteBuf = ByteBuffer.allocateDirect(yourFloatArray.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
yourFloatBuffer = byteBuf.asFloatBuffer();
yourFloatBuffer.put(yourFloatArray);
yourFloatBuffer.position(0);
Это должно сработать.
Комментарии:
1. это работает, Егор, я это знаю. но я хочу изменить массив с плавающей запятой позже во время выполнения… с помощью этого кода я не могу достичь
2. Я думаю, вам следует выполнять этот код каждый раз, когда вы меняете массив.
3. да, мы можем это сделать, но проблема в том, что когда я передаю буфер шейдеру, возможно, графический процессор использует его, и у меня нет контроля над ним … может быть, поэтому я получаю исключение
Ответ №2:
Это java.nio.Buffer? Потому что, кажется, вам нужно
java.nio.FloatBuffer
и вызвать FloatBuffer.array()
чтобы извлечь из него массив float[].
Но, очевидно, что это окончательное в FloatBuffer.java:
final float[] hb;
Итак, похоже, что вам нужно … возможно, расширить FloatBuffer и сделать массив не окончательным.