Intereting Posts
Ошибка входа в систему Google: вызвано: java.util.ConcurrentModificationException Android: как повернуть растровое изображение по центральной точке Android – создание изображений и значков Как Dalvik VM сохраняет и восстанавливает свои регистры между вызовами методов? Как получить имя приложения APK программно (не установлено) Как преобразовать Drawable в int и наоборот в Android Почему Linux является базой для устройств Android ProgressDialog (фрагмент), который работает через переключатель ориентации Каков самый быстрый способ фильтрации данных из ArrayList? Fragment_display_message: Моя первая ошибка приложения для Android Можно ли ссылаться на другую строку в файле strings.xml? Новая Relic не работает (студия gradle + android) Загрузите базу данных SQLite из Интернета и загрузите ее в приложение Android Android – JavaScript: событие touchstart не запускается до масштабирования или прокрутки страницы Rails3 и Devise работают с приложениями Iphone / Android / Wp7

Каков параметр «смещение» в GLES20.glVertexAttribPointer / glDrawElements, и откуда берутся ptr / индексы?

Я играю с OpenGL ES 2.0 в Android и просматриваю документы для GLES20. Я наткнулся на следующие методы:

public static void glDrawElements( int mode, int count, int type, Buffer indices) public static void glDrawElements( int mode, int count, int type, int offset) public static void glVertexAttribPointer( int indx, int size, int type, boolean normalized, int stride, Buffer ptr) public static void glVertexAttribPointer( int indx, int size, int type, boolean normalized, int stride, int offset) 

Два метода, которые берут объекты Buffer имеют смысл для меня, но другие два не делают. Где они получают индексы / attitute-значения (соответственно) и что offset смещение? (Я предполагаю, что эти два вопроса имеют один и тот же ответ.)

Смещение в прототипе означает, что вы отправляете массив INDEX перед этим вызовом. Это следует использовать, если вы используете объекты буфера Vertex Buffer Objects. Используйте glBindBuffer для привязки буфера индекса и укажите смещение, если необходимо, в следующем вызове ,

Сначала вам нужно привязать буфер (буфер индекса здесь), и вы можете указать, откуда ваши элементы начинаются со «смещения».

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_resources.element_buffer); glDrawElements( GL_TRIANGLE_STRIP, /* mode */ 4, /* count */ GL_UNSIGNED_SHORT, /* type */ (void*)0 /* element array buffer offset */ ); 

для

  public static void glVertexAttribPointer( int indx, int size, int type, boolean normalized, int stride, int offset) 

Это означает, что вы отправляете буфер вершин перед этим вызовом, и вы можете указать смещение от того места, где оно должно выполняться в буфере. Для получения дополнительной справки обратитесь к следующей ссылке. http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-2.3:-Rendering.html

Как вы и ожидали, оба имеют одну и ту же причину :). Надеюсь, это поможет!

Обновление: вам необходимо создать буфер для привязки его. Это можно сделать с помощью следующих шагов.

  glGenBuffers(); // create a buffer object glBindBuffer(); // use the buffer glBufferData(); // allocate memory in the buffer 

Проверьте эту ссылку для создания VBO. http://www.opengl.org/wiki/Vertex_Buffer_Object

Что касается типа смещения: смещение передается как указатель, но параметр используется для его целочисленного значения, поэтому мы передаем целое число, отличное от void *.

метод

 public static void glDrawElements( int mode, int count, int type, int offset) 

Используется с рендерингом с индексами VBO.

Offset – это смещение для индексаVBO в байтах ;

Перед его использованием вы должны загружать индексы в объект VBO:

 import static android.opengl.GLES20.*; private static final int SIZEOF_SHORT = 2; void fillIndices() { int indexAmount = ...; int sizeBytes = indexAmount * SIZEOF_SHORT; ShortBuffer indicesS = ByteBuffer.allocateDirect(sizeBytes).order(ByteOrder.nativeOrder()).asShortBuffer(); indicesS.put(getShortIndices(indexAmount)); indicesS.position(0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeBytes, indicesS, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } short[] getShortIndices(int indexAmount) { short[] indices = new short[indexAmount]; // fill indices here return indices; } 

Затем вы можете связать его и использовать с glDrawElements ()

 public void draw(){ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO); glDrawElements(GL_TRIANGLE_STRIP, indexCount, GL_UNSIGNED_SHORT, firstIndex * SIZEOF_SHORT);} glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } 

Вы можете использовать GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT и GL_UNSIGNED_INT в качестве индексов.