Python OpenGL将数据发送到着色器

问题描述 投票:1回答:1

什么有效:

着色器

#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个回答
1
投票

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

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

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

因此,如果偏移量为0,那么第五个参数可以是Nonec_void_p(0),否则偏移量必须是cazxswpoi的种姓:

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的状态向量中。所以VAO必须在之前被绑定(Vertex Array Object)。 此外,对当前绑定的顶点缓冲区对象的名称引用存储在VAO中。每个顶点属性都有自己的VBO引用。它们都可以是相同的,或者它们可以对所有或某些属性不同。所以glBindVertexArray(vao)也必须在之前受到约束。

© www.soinside.com 2019 - 2024. All rights reserved.