我需要从浮点矩阵([0..1])创建一个纹理。纹理应显示灰色方块,但仅显示白色矩形:(
我有这段代码:
def _generate_image(self):
i_len = len(self._data)*Config().get_pixels_per_tile()
j_len = len(self._data[0])*Config().get_pixels_per_tile()
data = ''.join([ chr(int(c*255)) for f in self._data for c in f for _ in range(3*Config().get_pixels_per_tile()) ])
print data
return ImageFromData(data, j_len, i_len, GL_RGB, GL_UNSIGNED_BYTE)
class ImageFromData(object):
def __init__(self, data, width, height, colors, type_):
self.w = width
self.h = height
self.image = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, self.image)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage2D( GL_TEXTURE_2D, 0, colors, width, height, 0, colors, type_, data )
谢谢!
答案 0 :(得分:1)
我认为您在将图像转换为字符串时可能会出错,因为那里有一组看起来很讨厌的嵌套for
循环: - )
因此,您的原始数据是像素行和列的浮点强度值的两个嵌套列表,您将复制它们三次以填充RGB通道?我想你想要这个:
def pixlist2string(pixlist):
tmp = []
for row in pixlist:
for pix in row:
for channel in xrange(3):
tmp.append(chr(int(255*pix)))
return ''.join(ss for ss in tmp)
但这是一种非常迂回的做事方式。转换为8位整数是不必要的 - 只需告诉glTexImage2D
输入数据类型为GL_FLOAT
并为其提供0到1之间的归一化值。同样,不需要复制输入像素以填充RGB如果您将输入格式设置为单通道(GL_INTENSITY
,GL_LUMINANCE
,GL_RED
等),则为频道。
我还强烈建议使用Numpy数组来保存输入的像素数据。然后,您可以将数组本身传递给glTexImage2D
,而无需摆弄字符串转换。