我喜欢使用Numpy创建要传递到glsl
的顶点数组。
Vertices
将是一个包含3个顶点信息的numpy数组。
每个vertex
包括:
pos = (x, y)
一种具有32位的64位带符号浮点格式
R分量以字节0..3为单位,而32位G分量以字节4..7为单位,
和color = (r, g, b)
一种96位带符号浮点格式,其格式为
以字节0..3为单位的32位R分量,以字节为单位的32位G分量
4..7,以及字节8..11中的32位B分量即每个vertex = (pos, color) = ( (x, y), (r, g, b) )
一个三角形有3个顶点,所以最后我需要一个1D numpy数组来描述
Vertices = [vertex1, vertex2, vertex3]
= [ ( (x, y), (r, g, b) ),
( (x, y), (r, g, b) ),
( (x, y), (r, g, b) ) ]
如何在numpy中创建Vertices
?以下语法看起来错误。
Vertices = np.array([( (x1, y1), (r1, g1, b1) ),
( (x2, y2), (r2, g2, b2) ),
( (x3, y3), (r3, g3, b3) )], dtype=np.float32)
每个vertex
的字节大小应为64/8 + 96/8 = 8 + 12 = 20个字节。
Vertices
的字节大小应为20字节x 3 = 60字节。
答案 0 :(得分:2)
这很简单,实际上是在numpy
中。使用structured arrays:
In [21]: PosType = np.dtype([('x','f4'), ('y','f4')])
In [22]: ColorType = np.dtype([('r','f4'), ('g', 'f4'), ('b', 'f4')])
In [23]: VertexType = np.dtype([('pos', PosType),('color', ColorType)])
In [24]: VertexType
Out[24]: dtype([('pos', [('x', '<f4'), ('y', '<f4')]), ('color', [('r', '<f4'), ('g', '<f4'), ('b', '<f4')])])
In [25]: VertexType.itemsize
Out[25]: 20
然后简单地:
In [26]: vertices = np.array([( (1, 2), (3, 4, 5) ),
...: ( (6, 7), (8, 9, 10) ),
...: ( (11, 12), (13, 14, 15) )], dtype=VertexType)
In [27]: vertices.shape
Out[27]: (3,)
基本索引编制:
In [28]: vertices[0]
Out[28]: (( 1., 2.), ( 3., 4., 5.))
In [29]: vertices[0]['pos']
Out[29]: ( 1., 2.)
In [30]: vertices[0]['pos']['y']
Out[30]: 2.0
In [31]: VertexType.itemsize
Out[31]: 20
numpy
曾经提供记录数组,因此您可以使用属性访问代替索引:
In [32]: vertices = np.rec.array([( (1, 2), (3, 4, 5) ),
...: ( (6, 7), (8, 9, 10) ),
...: ( (11, 12), (13, 14, 15) )], dtype=VertexType)
In [33]: vertices[0].pos
Out[33]: (1.0, 2.0)
In [34]: vertices[0].pos.x
Out[34]: 1.0
In [35]: vertices[2].color.g
Out[35]: 14.0