【发布时间】:2013-12-28 00:27:33
【问题描述】:
我正在使用(Python 和 PyOpenGL)交错 VBO(顶点、法线、颜色)的形式:
Vx1, Vy1, Vz1, Nx1, Ny1, Nz1, R1, G1, B1, A1, Vx2...
VBO 是通过以下方式生成的:
self.vbo_id = glGenBuffers (1)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id)
# upload data to VBO
data = model_loader.Model_loader(filename = "geometry.STL")
self.N_vertices = len(vertices)
alpha = 1
color = np.array([[0.1, 0.1, 0.1, alpha]], dtype='float32')
colors = np.repeat(color, self.N_vertices, axis=0)
VBO_data = VBO_reshape.create_VBO_array(data.vertices, data.normals, colors, GL_primitive_type = "triangle", interleaved_type = "true")
VBO_size_bytes = arrays.ArrayDatatype.arrayByteCount(VBO_data)
glBufferData(GL_ARRAY_BUFFER, VBO_size_bytes, VBO_data, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id)
VBO 的几何图形是用代码绘制的:
v_pointer = ctypes.c_void_p(0)
n_pointer = ctypes.c_void_p(12)
c_pointer = ctypes.c_void_p(24)
v_stride = 40
n_stride = 40
c_stride = 40
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.vbo_id)
# enable vertex array
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT, v_stride, v_pointer)
# enable normal array
glEnableClientState(GL_NORMAL_ARRAY)
glNormalPointer(GL_FLOAT, n_stride, n_pointer)
# enable color array
glEnableClientState(GL_COLOR_ARRAY)
glColorPointer(4, GL_FLOAT, c_stride, c_pointer)
glDrawArrays(GL_TRIANGLES, 0, self.N_vertices)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) # reset
glDisableClientState(GL_COLOR_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
glDisableClientState(GL_VERTEX_ARRAY)
几何体(顶点和法线)绘制正确(见下图)。我想用不同的颜色绘制每个顶点,但没有绘制任何颜色?有什么建议如何使用GL_TRIANGLES 绘制顶点颜色并调用gl_DrawArrays() 和glColorPointer?我必须使用着色器还是可以在没有着色器的情况下完成?如果我理解正确,它可以在不使用着色器的情况下完成。
【问题讨论】:
标签: python opengl shader vbo pyopengl