2

floats([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:-)

元のデータは、ピクセルの行と列の float 強度値の 2 つのネストされたリストであり、RGB チャネルを埋めるためにそれらを 3 回コピーするつもりですか? 私はあなたがこれを望んでいると思います:

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 の間の正規化された値を指定するだけです。同様に、入力形式を single-チャネル ( GL_INTENSITYGL_LUMINANCEなどGL_RED)。

また、入力ピクセル データを保持するために Numpy 配列を使用することを強くお勧めします。glTexImage2D次に、文字列変換をいじることなく、配列自体を渡すことができます。

于 2013-02-20T03:42:16.790 に答える