Как передать массив с плавающей запятой в glVertexAttribPointer

#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 и сделать массив не окончательным.