ぼやけることなくOpenGLテクスチャを拡大縮小するにはどうすればよいですか?


15

LWJGLを介してOpenGLを使用しています。

16x16で16x16テクスチャのクワッドレンダリングがあります。スケール量を変更すると、クワッドは大きくなり、大きくなるにつれてぼやけます。

Minecraftのように、ぼやけることなく拡大縮小する方法を教えてください。

RenderableEntityオブジェクト内のコードは次のとおりです。

public void render(){       
    Color.white.bind();
    this.spriteSheet.bind();        
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0,0);
        GL11.glVertex2f(this.x, this.y);
        GL11.glTexCoord2f(1,0);
        GL11.glVertex2f(getDrawingWidth(), this.y);
        GL11.glTexCoord2f(1,1);
        GL11.glVertex2f(getDrawingWidth(), getDrawingHeight());
        GL11.glTexCoord2f(0,1);
        GL11.glVertex2f(this.x, getDrawingHeight());
     GL11.glEnd();

}

そして、ここに私のゲームクラスの私のinitGLメソッドからのコードがあります

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glClearColor(0.46f,0.46f,0.90f,1.0f);
GL11.glViewport(0,0,width,height);
GL11.glOrtho(0,width,height,0,1,-1);

そして、これが実際の描画を行うコードです

public void start(){
    initGL(800,600);
    init();

    while(true){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        for(int i=0;i<entities.size();i++){
            ((RenderableEntity)entities.get(i)).render();
        }

        Display.update();
        Display.sync(100);

        if(Display.isCloseRequested()){
            Display.destroy();
            System.exit(0);
        }
    }
}

回答:


17

次のように、テクスチャの拡大タイプを変更する必要があります。

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterについて読みください。


テクスチャが拡大されて表示されているので、彼が変更したいのは倍率ではないでしょうか?
ネバーレンダー

Ricketにご返信いただきありがとうございます。glTexParameterのドキュメントを読んだところ、ここには多くの便利な機能があります。さらに、コードをレンダリングするためにGL_TEXTURE_MINとを追加しましたGL_TEXTURE_MAG。期待どおりに動作します。今、私は詳細を学ぶために出かけています。
愛らしい

@ZachB、あなたは正しいと思うし、それに応じて編集した。この回答を準備するとき、ドキュメントを非常に注意深く読みましが、おそらく自分がそうするのを混乱させただけでしょう。片方だけをテストしてからもう片方をテストしますが、現時点でテストするのに便利なものはありません。
リケット

7

できません。あらゆる種類のデジタルデータの性質は、情報が削除されると元に戻せないことです。同様に、そもそも存在しなかった情報を入力することはできません。ぼやけてしまいます。

GL_NEARESTを使用してもぼやけることはありませんが、代わりにピクセル化されます。

解決策は、ミップマップでより大きなテクスチャを使用することです。そうすることで、テクスチャのジオメトリのサイズに関係なく、高品質を得ることができます。


2
私は彼から「Minecraftのように」と言ったが、愛らしい子犬はピクセル効果を探していた。私はそれがそのように尋ねられることさえ考えませんでした。
リケット

ご意見をお寄せいただきありがとうございます。いくつかの異なるレンダリングスタイルを一緒にミックスするため、必要になります。
愛らしい

問題は、なぜテクスチャを複数回オーバーラップできないのですか?
joehot200

2

私はこの問題を直接経験しました-低解像度(8px * 8px)テクスチャのブロックベースのゲームを作成しています。カメラの距離に関係なく、テクスチャがOpenGLのデフォルト設定によってクロス「ブレンド」されていました-ぼやけて見えました。

バイリニアフィルタリングを無効にするには、「最も近い」倍率を有効にする必要があります。つまり、カメラをテクスチャの近くにズームインすると、各ピクセルは、最も近いテクセルの色として定義され、ブレンドされません。

これを行うには、次の2行を使用します。

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