Может ли glVertexAttribPointer () последним при значении атрибута в OpenGL быть массивом? - PullRequest
0 голосов
/ 10 ноября 2018

Теперь у меня есть два пользовательских шейдера, вершинный шейдер положения и шейдер цветного фрагмента. И я определяю два массива данных, положение Array и цвет Array. Это может сделать градиентный треугольник в iPhone. Я не вызывал glBindBuffer () и glBufferData () для VAO. но в glVertexAttribPointer () я отправляю массив позиции в его последний атрибут и массив цветов тоже. Теперь я запутался: я обнаружил, что большинство документов объясняют последний атрибут в этой функции, он смещен в массиве данных вершин. теперь я отправляю его в массив данных и не вызывал glBindBuffer () и glBufferData (), но это вступает в силу。

lazy var postions : [GLfloat] = [
    -0.5, -0.5, 0.0,
    0.5, -0.5, 0.0,
    0.0,  0.5, 0.0,
    ]

lazy var colors : [GLfloat] = [
    1, 0, 0,
    0, 1, 0,
    0, 0, 1,
    ]

и это код о glVertexAttribPointer

let posistionAtt : GLuint = GLuint(glGetAttribLocation(shaderProgram, "position"))
    glVertexAttribPointer(posistionAtt, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(3 * MemoryLayout<GLfloat>.size), postions)
    glEnableVertexAttribArray(posistionAtt)

    let ptr = UnsafePointer<Int>.init(bitPattern: 3 * MemoryLayout<GLfloat>.size)
    let colorAtt : GLuint = GLuint(glGetAttribLocation(shaderProgram, "color"))
    glVertexAttribPointer(colorAtt, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(3 * MemoryLayout<GLfloat>.size), colors)
    glEnableVertexAttribArray(colorAtt)

результат для градиентного треугольника в iPhone

1 Ответ

0 голосов
/ 10 ноября 2018

Если объект буфера вершин не привязан, то последний параметр обрабатывается как указатель на данные.

См. спецификация OpenGL ES 2.0; 2,8. Решетки VERTEX; 21

void VertexAttribPointer( uint index, int size, enum type, 
                          boolean normalized,  sizei stride, 
                          const void *pointer );

... Для каждой команды pointer указывает местоположение в памяти первого значения первого элемента указанного массива.

См. Спецификация OpenGL ES 2.0; 2.9. БУФЕРНЫЕ ОБЪЕКТЫ; 25

... Когда массив получен из объект буфера, значение указатель этого массива используется для вычисления смещения, в основном узлы машины, в хранилище данных объекта буфера. ...

Это означает, в случае

glBindBuffer(GL_ARRAY_BUFFER, 0)
glVertexAttribPointer(...., pointer)

pointer должен быть указателем на данные массива вершин - массив данных массива вершин.

Но в случае

glBindBuffer(GL_ARRAY_BUFFER, vbo)  // vbo != 0
glVertexAttribPointer(...., offset)

offset должно быть смещением для хранилища данных vbo.

...