Каков параметр «смещение» в 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 в качестве индексов.