为了账号安全,请及时绑定邮箱和手机立即绑定

Python OpenGL 将数据发送到着色器

Python OpenGL 将数据发送到着色器

慕村9548890 2021-12-26 15:37:39
什么有效:着色器#version 330 coreattribute 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);    }Pythonvao = 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] 附加到当前顶点并让它们成为紫外线属性。我尝试使用组合的 [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)但是,这不起作用。我尝试过的其他一切都是这个的一些变体,所有这些都失败了。我似乎无法理解如何正确发送数据。
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


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


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


因此,如果偏移量为 0,则第 5 个参数可以是None,c_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被调用时,通用顶点属性数组的规范存储在当前顶点数组对象的状态向量中。所以必须在 ( glBindVertexArray(vao))之前绑定 VAO 。

此外,对当前绑定的顶点缓冲区对象的名称引用存储在 VAO 中。每个顶点属性都有自己的 VBO 引用。对于所有或某些属性,它们可以全部相同,也可以不同。所以之前也必须绑定顶点缓冲区对象。


查看完整回答
反对 回复 2021-12-26
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信