テクスチャにロードされたときのPNG画像ぼやけ
-
02-10-2019 - |
質問
Photoshopで、ロードしてOpenGLプログラムを備えたPhotoshopでPNG画像を作成しました。私はそれをテクスチャにバインドし、プログラムでは写真がぼやけているように見えますが、その理由はわかりません。
Alt Text http://img685.imageshack.us/img685/9130/upload2.png
Alt Text http://img695.imageshack.us/img695/2424/upload1e.png
コードの読み込み
// Texture loading object
nv::Image title;
// Return true on success
if(title.loadImageFromFile("test.png"))
{
glGenTextures(1, &titleTex);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}
else
MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);
コードを表示します
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
編集:私は各ピクセルを伸ばしているとは思わない。
int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
解決
OpenGLは(通常)テクスチャ自体が2のパワーであるサイズを必要とするため、(おそらく)起こっているのは、テクスチャが寸法が2のパワーであるサイズにスケーリングされていることです。 それから それは元のサイズに戻されています - 2回スケーリングされる過程で、あなたはいくらかの品質を失います。
どうやら、スケーリングなしでビットマップを表示したいだけでなく、別のオブジェクトの表面に包むことなく、またはそのようなもの(つまり、テクスチャが目的としているもののいずれか)を表示したいだけです。その場合、テクスチャではなく、ビットマップとして表示するだけです(例を参照 glRasterPos2i
と glBitmap
).
他のヒント
そもそもスタート画面の静的画像にMIPMAPPINGと異方性フィルタリングを使用したいのはなぜですか?画像が回転する可能性は低いように見えます(異方性フィルタリングのためのもの)、または実際に速く何度もサイズ変更する必要があります(MIPMAPPINGのためのもの)。
テクスチャが伸びている場合:使用してみてください GL_NEAREST
あなたのための GL_MAG_FILTER
, 、この場合、それはより良い結果を与える可能性があります(GL_LINEAR
より正確ですが、ぼやけの性質があります)。
テクスチャが最小化されている場合:同じものを使用してみてください GL_NEAREST_MIPMAP_NEAREST
, 、またはさらに良いことに、mipmapsを使用しないでください GL_NEAREST
(また GL_LINEAR
, 、どちらかがあなたに最良の結果を与えてください)。
PNGに2のパワーの解像度を持たせることをお勧めします。 IE 1024x512そして、画面の解像度のまだ左上隅に描画したい部分を配置します。次に、テクスコードを800.0/1024.0および600.0/512.0に再販売して、テクスチャから正しい部分を取得します。私は何が起こっているのかを信じています glTexImage2D
いつのパワーではないが、入力画像をスケーリングできる幅と高さを処理することができます。
これを処理する例を表示できます ここ (iPhone -OpenGles-スクリーンパートを2の画面パーツをつかみ、512x512のテクスチャに引き込み、再実行するプロジェクト GL_TEXTURE
マトリックス、123行目、テックスコードの手動でのリスケールを行う代わりに)
ここ この方法に言及している別の投稿です。
これが仮説です:
窓は800x600(そしておそらくフレームバッファーも)ですが、窓の装飾のため、クライアント領域はそうではありません。
そのため、ウィンドウのクライアント領域に貼り付けられると、フレームバッファーがサイズ変更されます。ウィンドウ作成コードを確認できますか?
- ウィンドウのクライアント領域の正確なサイズに注意してください。ダブルチェックあなたがそれが期待されるものです
- ピクセルアライメントルールに注意してください。ピクセルセンターを押すには、X/Y座標に0.5を追加する必要がある場合があります。 DirectXの説明を見つけることができます ここ - ただし、OpenGLルールは異なる場合があります。