2

我需要从浮点矩阵([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 )

谢谢!

4

1 回答 1

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_FLOAT0 和 1 之间的标准化值即可。同样,如果将输入格式设置为单一,则无需复制输入像素来填充 RGB 通道 -频道(GL_INTENSITY,GL_LUMINANCEGL_RED)。

我还强烈建议使用 Numpy 数组来保存您的输入像素数据。然后,您可以将数组本身传递给glTexImage2D而无需摆弄字符串转换。

于 2013-02-20T03:42:16.790 回答