Как OpenGLES узнает, на какой атрибут ссылается массив - PullRequest
0 голосов
/ 23 октября 2011

Я смотрю на пример от Apple, как использовать массивы вершин:

typedef struct _vertexStruct
{
    GLfloat position[2];
    GLubyte color[4];
} vertexStruct;
enum {
   ATTRIB_POSITION,
   ATTRIB_COLOR,
   NUM_ATTRIBUTES };

void DrawModel()
{
    const vertexStruct vertices[] = {...};
    const GLubyte indices[] = {...};

    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE,
        sizeof(vertexStruct), &vertices[0].position);
    glEnableVertexAttribArray(ATTRIB_POSITION);
    glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE,
        sizeof(vertexStruct), &vertices[0].color);
    glEnableVertexAttribArray(ATTRIB_COLOR);

    glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(GLubyte),
        GL_UNSIGNED_BYTE, indices);
}

( источник )

Как OpenGL узнает, какой цвета какая вершина?ATTRIB_POSITION и ATTRIB_COLOR определяются пользователем, поэтому opengl не должен знать, что это значит.В частности, я стараюсь использовать постоянные цвета и массивы вершин / текстур.Если я изменю ATTRIB_COLOR на ATTRIB_TEXTURE OpenGL ничего не заметит, как я могу это сделать?

1 Ответ

4 голосов
/ 23 октября 2011

Примечание: в следующем предполагается, что OpenGL ES 2.0.

OpenGL не знает и не заботится о том, что означает какой-либо конкретный атрибут вершины.Все, что ему нужно, это число: индекс атрибута.

Ваш вершинный шейдер определяет количество атрибутов, которые он принимает в качестве входных данных, используя ключевое слово attribute.Ваша задача - связать эти атрибуты GLSL с индексами атрибутов OpenGL, используя glBindAttribLocation перед связыванием программы.Таким образом, атрибут 0 - это только позиция, если вы связываете атрибут позиции шейдера с атрибутом 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...