【问题标题】:Could glVertexAttribPointer() last at attribute value in OpenGL be a array ?OpenGL中的glVertexAttribPointer()最后一个属性值可以是一个数组吗?
【发布时间】:2018-11-12 17:05:33
【问题描述】:

现在我有两个自定义着色器,位置顶点着色器和颜色片段着色器。我定义了两个数组数据,位置数组和颜色数组。这可以使 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

【问题讨论】:

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


    【解决方案1】:

    如果没有绑定顶点缓冲区对象,则最后一个参数被视为指向数据的指针。

    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 数据存储的偏移量。

    【讨论】:

    • 我能这样理解吗。位置和颜色在这个例子中,它们的元素没有偏移,所以我可以将数组发送为 glVertexAttribPointer(..., array)
    • @ADDICE 是的。对于glBindBuffer(GL_ARRAY_BUFFER, 0)glVertexAttribPointer(..., array)array是数据数组。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多