glVertexAttribPointer()能否在OpenGL中的属性值最后为数组?

时间:2018-11-10 17:57:57

标签: swift opengl-es opengl-es-2.0

现在,我有两个自定义着色器,即位置顶点着色器和颜色片段着色器。我定义了两个数组数据,位置数组和颜色数组。这样可以在iPhone中制作渐变三角形。 我没有为VAO调用glBindBuffer()和glBufferData()。但是在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)

the result for the gradient triangel in the iPhone

1 个答案:

答案 0 :(得分:0)

如果未绑定任何顶点缓冲区对象,则将最后一个参数视为指向数据的指针。

请参见OpenGL ES 2.0 specification; 2.8. VERTEX ARRAYS; 21

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

...   对于每个命令, pointer 都指定要指定的数组第一个元素的第一个值在内存中的位置。

请参见OpenGL ES 2.0 specification; 2.9. BUFFER OBJECTS; 25

  

...当数组来源于   缓冲对象,该数组的 pointer 值用于计算偏移量,基本   机器单元,放入缓冲区对象的数据存储区。 ...

这意味着,如果出现

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

pointer必须是指向顶点数组数据的指针-顶点数组数据的数组。

但是在

的情况下
glBindBuffer(GL_ARRAY_BUFFER, vbo)  // vbo != 0
glVertexAttribPointer(...., offset)

offset必须是vbo数据存储区的偏移量。