【问题标题】:Python OpenGL sending data to shaderPython OpenGL 向着色器发送数据
【发布时间】:2019-04-03 01:36:53
【问题描述】:

什么有效:

着色器

#version 330 core

attribute vec3 pos;
attribute vec2 uv;

    out vec3 color;

    uniform mat4 view;
    uniform mat4 projection;

    void main() {
      gl_Position = projection * view * vec4(pos.xy, sin(10.0*(pos.x + pos.y))/8.0 + 1.0, 1.0);
      color = vec3(pos.xy, sin(10.0*(pos.x + pos.y))/8.0);
    }

蟒蛇

vao = glGenVertexArrays(1)
glBindVertexArray(vao)
#                            [x, y, z]
vertices = vbo.VBO(np.array([[...],[...],...], dtype=np.float32))

def draw():
    glUseProgram(program)

    glUniformMatrix4fv(projectionLoc, 1, False, perspectiveMatrix)
    glUniformMatrix4fv(viewLoc, 1, False, viewMatrix)
    vertices.bind()
    glEnableClientState(GL_VERTEX_ARRAY)
    glVertexPointer(3, GL_FLOAT, 12, vertices)
    glDrawArrays(GL_TRIANGLES, 0, lenVerticesArray)
    vertices.unbind()

我希望有一个单独的 uv 值数组 [x, y] 传递给 uv 属性,或者将它们附加到当前顶点作为 [x, y, z, ux, uy] 和让它们成为 uv 属性。

我尝试使用组合的 [x, y, z, ux, uy] 执行以下操作:

glEnableVertexAttribArray(posLoc)
glVertexAttribPointer(posLoc, 3, GL_FLOAT, False, 12, vertices)
glEnableVertexAttribArray(uvLoc)
glVertexAttribPointer(uvLoc, 2, GL_FLOAT, False, 12, vertices+12)

但是,这不起作用。我尝试过的其他一切都是这种情况的一些变体,所有这些都失败了。我似乎无法理解如何正确发送数据。

【问题讨论】:

    标签: python pyopengl


    【解决方案1】:

    glVertexAttribPointer的第5个参数是连续通用顶点属性之间的字节偏移量。

    在您的情况下,属性元组由 5 个浮点数 [x, y, z, ux, uy] 组成。所以偏移量必须是 5*4 = 20。

    如果绑定了命名缓冲区对象,则 glVertexAttribPointer 的第 6 个参数将被视为缓冲区对象数据存储中的字节偏移量。但无论如何,参数的类型是一个指针(c_void_p)。

    因此,如果偏移量为 0,则第 5 个参数可以是 Nonec_void_p(0),否则偏移量必须为 c_void_p

    glBindVertexArray(vao)
    
    glEnableVertexAttribArray(posLoc)
    glEnableVertexAttribArray(uvLoc)
    
    vertices.bind()
    glVertexAttribPointer(posLoc, 3, GL_FLOAT, False, 20, None)
    glVertexAttribPointer(uvLoc, 2, GL_FLOAT, False, 20, c_void_p(12))
    

    vertices.bind() 假定绑定顶点数组对象 (glBindBuffer(GL_ARRAY_BUFFER, vbo))。
    当调用glVertexAttribPointer 时,通用顶点属性数组的规范存储在当前Vertex Array Object 的状态向量中。所以必须先绑定 VAO (glBindVertexArray(vao))。
    此外,对当前绑定的顶点缓冲区对象的名称引用存储在 VAO 中。每个顶点属性都有自己的 VBO 引用。它们可以全部相同,也可以针对所有或某些属性而不同。所以Vertex Buffer Object 之前也必须绑定。

    【讨论】:

    • 这行得通,我现在可以将 UV 数据附加到顶点,我相信我的问题是偏移量和步幅,我之前确实做过c_void_p,但可能是尺寸错误,我使用np.finfo(np.float32).nexp 来获得浮动大小(8),np.finfo(GL_FLOAT).nexp 给出了相同的大小。但是,(不确定它是否是我的 OpenGL 版本)没有glEnablePointer,它的glEnableVertexAttribArray IDE 在搜索“glEnable”时将其作为选项返回。
    • @Drew 非常抱歉,我的疏忽。我只是复制/粘贴了您问题的那部分代码,并没有进一步考虑。
    • 不是问题,这是我的错字,奇怪的是我复制错了。
    猜你喜欢
    • 2016-03-02
    • 2014-04-14
    • 1970-01-01
    • 2017-06-03
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多