Python 从浮点数组到纹理

2 投票
1 回答
796 浏览
提问于 2025-04-17 13:44

我需要从一个浮点数矩阵(范围是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 )

谢谢!

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_FLOAT,并且给它0到1之间的标准化值就行了。同样,如果你把输入格式设置为单通道(比如GL_INTENSITYGL_LUMINANCEGL_RED等),就不需要重复输入像素来填充RGB通道了。

我还强烈建议你使用Numpy数组来存放你的输入像素数据。这样你就可以直接把数组传给glTexImage2D,而不用去搞什么字符串转换了。

撰写回答