LoginSignup
5

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5