Теперь у меня есть два пользовательских шейдера, вершинный шейдер положения и шейдер цветного фрагмента. И я определяю два массива данных, положение 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