Python OpenGL 向着色器发送数据
Python OpenGL sending data to shader
什么有效:
着色器
#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);
}
python
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)
但是,这不起作用。我尝试过的其他一切都是这个的一些变体,所有这些都失败了。我似乎无法理解如何正确发送数据。
glVertexAttribPointer
的第5个参数是连续通用顶点属性之间的字节偏移。
在你的例子中,属性元组由 5 个浮点数 [x, y, z, ux, uy] 组成。所以偏移量必须是 5*4 = 20.
如果绑定了命名缓冲区对象,则 glVertexAttribPointer
的第 6 个参数被视为缓冲区对象数据存储中的字节偏移量。但无论如何,参数的类型是一个指针(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
时,通用顶点属性数组的规范存储在当前 Vertex Array Object 的状态向量中。所以必须先绑定VAO (glBindVertexArray(vao)
).
此外,对当前绑定的顶点缓冲区对象的名称引用存储在 VAO 中。每个顶点属性都有自己的 VBO 引用。它们可以全部相同,也可以对于所有或某些属性不同。所以 Vertex Buffer Object 之前也必须绑定。
什么有效:
着色器
#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);
}
python
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)
但是,这不起作用。我尝试过的其他一切都是这个的一些变体,所有这些都失败了。我似乎无法理解如何正确发送数据。
glVertexAttribPointer
的第5个参数是连续通用顶点属性之间的字节偏移。
在你的例子中,属性元组由 5 个浮点数 [x, y, z, ux, uy] 组成。所以偏移量必须是 5*4 = 20.
如果绑定了命名缓冲区对象,则 glVertexAttribPointer
的第 6 个参数被视为缓冲区对象数据存储中的字节偏移量。但无论如何,参数的类型是一个指针(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
时,通用顶点属性数组的规范存储在当前 Vertex Array Object 的状态向量中。所以必须先绑定VAO (glBindVertexArray(vao)
).
此外,对当前绑定的顶点缓冲区对象的名称引用存储在 VAO 中。每个顶点属性都有自己的 VBO 引用。它们可以全部相同,也可以对于所有或某些属性不同。所以 Vertex Buffer Object 之前也必须绑定。