Что такое параметр «смещение» в GLES20.glVertexAttribPointer / glDrawElements и откуда берется ptr / indexes? - PullRequest
4 голосов
/ 10 октября 2011

Я играю с 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 объекты, имеют смысл для меня, но два других - нет. Откуда они получают индексы / attibute-значения (соответственно) и в чем смещение offset? (Я предполагаю, что эти два вопроса имеют одинаковый ответ.)

Ответы [ 2 ]

6 голосов
/ 10 октября 2011

Смещение в прототипе означает, что вы отправляете массив INDEX до этого вызова. Это следует использовать, если вы используете VBO (объекты вершинного буфера). Используйте 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 *.

0 голосов
/ 16 октября 2015

Метод

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

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

смещение - это смещение индекса 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 в качестве индексов.

...