Help us understand the problem. What is going on with this article?

cocos2d/pyglet でぼやけないスプライトを描画する

More than 5 years have passed since last update.

cocos2d というか pyglet は、2Dスプライトに使うテクスチャの補完パラメーターがデフォルトでは GL_LINEAR になるらしく、タイル状にスプライトを並べた絵から矩形を切り出して使うと、ちょっとだけ隣のピクセルが滲んでくる。

まあ、スプライトを拡大縮小すると境界はボケないのに中だけぼやけて、いかにもOpenGLくさい感じになってしまうのもアレだしなぁ。8bit感のあるジャギジャギな絵で割りきって作りたい。

これ、テクスチャの GL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTERGL_NEAREST を付ければよさそう。ロードした時点でもう付けておく。

image = pyglet.image.load('hoge.png')
glBindTexture(image.texture.target, image.texture.id)
glTexParameteri(image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

sprite = Sprite(image.texture)

これでピクセルがボケない。

sprite1 = Sprite(image.texture.get_region(0, image.height - 32, 32, 32))
sprite2 = Sprite(image.texture.get_region(32, image.height - 32, 32, 32))
actor_layer.add(sprite1)
actor_layer.add(sprite2)

タイルの隣のピクセルも滲み出してこない。

TMXのタイルマップを読み込んだ場合、暗黙的に画像がロードされて個別のテクスチャになってしまうようなので、タイルセットの全タイル定義に適用する。

map_resource = cocos.tiles.load('fuga.tmx')
for res in map_resource.contents.values():
    if isinstance(res, cocos.tiles.TileSet):  # タイルセットだけ
        for tile in res.values():
            glBindTexture(tile.image.texture.target, tile.image.texture.id)
            glTexParameteri(tile.image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
            glTexParameteri(tile.image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

適用前
screenshot-1451988721.png

適用後
screenshot-1451988559.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away