ぼやけずにピグレットでピクセルアートのサイズを変更するにはどうすればよいですか?


7

私は8x8ピクセルの画像のタイルセットを持っているので、ゲームでそれらのサイズを2倍に変更したいと思います(16x16ピクセル、たとえば各ピクセルを2x2ブロックに変換します)。私が達成しようとしているのはMinecraft-エフェクトのように、小さなピクセルイメージをより大きなブロックピクセルにスケーリングします。

Pygletでは、スプライトのscaleプロパティはピクセルをぼかします。他の方法はありますか?

作業コード:

これが機能する解決策です(DManの永続性とJimmyの洞察力に感謝します)。

image = resource.image('tileset.png')                                                                                                                                                               
texture = image.get_texture()   
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)                                                                                                                               
texture.width = 16 # resize from 8x8 to 16x16                                                                                                                                                                  
texture.height = 16                                                                                                                                                                                                                                                                                                                       
texture.blit(100, 30) # draw                                                                                                                                                                        

3
私はこれを答えにするのに十分なほどPygletに精通していませんが、OpenGLを使用できることを確認したのでfrom pyglet.gl import *、でtalisman.org/opengl-1.1/Reference/glTexParameter.htmlを呼び出しますGL_NEAREST
DMan、2011年

よろしくお願いしますが、これまでOpenGLを使用したことがありません。グラフィックプログラミングの新機能の種類:\
theabraham

Pygletが舞台裏でどの程度行うかはわかりませんが、次のようなものが機能する可能性がありますglEnable(GL_TEXTURE_2D)。次に、が呼び出されたとしa = image.load('blah.jpg')ます。tex = a.texture次にglBindTexture(GL_TEXTURE_2D, texture.id)、最後にへの呼び出しを割り当てpyglet.gl.glTexParameteri(pyglet.gl.GL_TEXTURE_2D, pyglet.gl.GL_TEXTURE_MIN_FILTER, pyglet.gl.GL_NEAREST)ます。私はPythonのOpenGLの名前空間についてあまり詳しくないので、完全な呼び出しを修飾しました。OpenGLをインポートしたので、少なくとも前面のpygletを削除でき、おそらくglも削除できると思います。
DMan、2011年

うまくいかなかったので、アップデートのコードをもう一度確認してください。また、これらのGLコマンドを理解するのに役立つリソースはありますか?助けてくれてありがとう。
theabraham

すぐに気付いたのは、を呼び出す前にテクスチャの幅と高さを設定していることですglTexParameteri。Pygletがベースにしていると思われるOpenGL 1/2 /〜3には、これらの即時モードコマンドがあります。つまり、コマンドを実行して状態を変更すると、その後のすべてが変更されます。まず、glコールの下にコールを移動します。
DMan、2011年

回答:


8

コメント者のリクエストで...

Pygletの専門家への警告:これを行うためのPygletの良い方法があるかもしれませんが、これはそうではありません。これは、OpenGLの優れた方法です。警告されました!

OpenGLでこれを行うには、最初にテクスチャをバインドしてから、glTexParameteriまたは同様のバリアントを呼び出します。Pygletでこれを行うには、OpenGLをインポートします。

from pyglet.gl import *

次にGL_TEXTURE_2D、ターゲットを設定できるようにします。これは常に必要なわけではありませんが、他のいくつかのバインディングではこれを完全な状態に保ちます。

glEnable(GL_TEXTURE_2D)

Pygletでは、テクスチャをバインドする必要もないようです。画像を読み込んでテクスチャIDを取得し、を使用する必要がある場合がありますglBindTexture(GL_TEXTURE_2D, texture.id)。これらは既にPygletで設定されている状態であるという私の仮定。

次のステップはを呼び出すことglTexParameteriです。これについて私を修正してくれたジミーに感謝します:正しい電話は:

gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)

簡単な内訳:1つ目は、ターゲットを設定してOpenGLがあなたが話していることを認識できるようにすることです。2つ目のパラメーターは、設定するフィルターのタイプです。MAG_FILTERテクスチャの拡大率を制御するので正しいです。最後のパラメータはGL_NEARESTで、テクスチャのスケーリング方法を制御します。GL_NEAREST基本的にはピクセルスタイルのテクスチャを与える高速スケールです。GL_LINEAR通常であり、代わりにテクスチャを滑らかにぼかします。

私が話しているこのバージョンのOpenGL(正式には<OpenGL 3.2について)は、状態を設定する即時モードを使用します。状態が設定されたので、テクスチャをスケーリングできます。Renold自身が実際に機能するコードとして投稿したコードを表示するのが一番です。

image = resource.image('tileset.png')                                                                                                                                                               
texture = image.get_texture()   
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)                                                                                                                               
texture.width = 16 # resize from 8x8 to 16x16                                                                                                                                                                  
texture.height = 16                                                                                                                                                                                                                                                                                                                       
texture.blit(100, 30) # draw

レノルド、これを見て改善を提案できるとしたら、それは素晴らしいことです。でも、何かに興味があります。を削除した場合texture = image.get_texture()、それは機能しますか?内部的にテクスチャをバインドしない限り、それを呼び出したことはないようです。
DMan、

ええ、あなたはそれを必要としないことがわかります。私は最終的に画像をスプライトに入れて、それはうまくimage = resource.image('tileset.png') \n sprite = sprite.Sprite(image, x_pos, y_pos) \n sprite.scale = 2 \n
いきました

4

私のように、すべてをピクセル化するためにレトロスタイルのゲームを作成するだけの場合、簡単な答えは、次のコードで開始します。

from pyglet.gl import *
glEnable(GL_TEXTURE_2D)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

その後、スプライトなどのすべての使用法は、引き続き素晴らしく、ピクセル化されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.