5

ロードした透明度とOpenGLプログラムを使用して、Photoshopでpng画像を作成しました。テクスチャにバインドしましたが、プログラムでは画像がぼやけて見えますが、その理由はわかりません。

代替テキスト http://img685.imageshack.us/img685/9130/upload2.png

代替テキスト 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);

編集:座標系で各ピクセルを2つにする必要があるとは思わない

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);
4

5 に答える 5

4

OpenGLは(通常)テクスチャ自体のサイズが2の累乗である必要があるため、(おそらく)発生しているのは、テクスチャが2の累乗のサイズにスケーリングされてから、スケールバックされることです。元のサイズ-2回スケーリングされる過程で、品質が低下します。

どうやら、ビットマップをスケーリングせずに、別のオブジェクトの表面にラップせずに、またはそのようなもの(つまり、テクスチャが意図されているもののいずれか)で表示したいだけのようです。その場合、テクスチャではなくビットマップとして表示します(たとえば、glRasterPos2iとを参照glBitmap)。

于 2010-04-27T21:50:09.577 に答える
3

そもそも、スタート画面の静止画像にミップマッピングと異方性フィルタリングを使用する必要があるのはなぜですか? 画像が回転する (異方性フィルタリングの目的) か、非常に高速に何度もサイズ変更する必要がある (ミップマッピングの目的) 可能性は低いようです。

テクスチャが引き伸ばされている場合: を使用GL_NEARESTしてみてくださいGL_MAG_FILTER。この場合、より良い結果が得られる可能性があります (GL_LINEARより正確ですが、ぼかしの性質があります)。

テクスチャが最小化されている場合: 同じことを使用してみてください。または、GL_NEAREST_MIPMAP_NEARESTミップマップを使用せずにGL_NEAREST(またはGL_LINEAR、最良の結果が得られる方) を使用してみてください。

于 2010-04-27T19:18:27.540 に答える
2

PNGの解像度を2の累乗にすることをお勧めします。つまり、1024x512 で、描画したい部分を画面の解像度のまま左上隅に配置します。次に、texcoords を 800.0/1024.0 および 600.0/512.0 に再スケーリングして、テクスチャから適切な部分を取得します。起こっていることはglTexImage2D、2のべき乗ではない幅と高さを処理できる場合があると信じていますが、入力画像をスケーリングしてフィルタリングすることができます。

これを処理する例は、ここで見ることができます(iPhone - OpenGLES - 2 のべき乗以外のスクリーン パーツを取得し、それを 512x512 テクスチャに描画し、GL_TEXTUREマトリックスの 123 行目を再スケーリングするプロジェクト。texcoords を手動で再スケーリングする代わりに)。 )

この方法について言及している別の投稿があります。

于 2010-04-27T20:44:45.447 に答える
1

ここに仮説があります:

ウィンドウは800x600(おそらくフレームバッファも)ですが、側面のウィンドウ装飾のため、クライアント領域はそうではありません。

そのため、ウィンドウのクライアント領域にブリットされると、フレームバッファのサイズが変更されます。ウィンドウ作成コードを確認できますか?

于 2010-04-27T19:55:40.717 に答える
0
  • ウィンドウのクライアント領域の正確なサイズに注意してください。それがあなたが期待するものであることを再確認してください
  • ピクセルの配置規則に注意してください。ピクセルの中心に到達するには、x/y 座標に 0.5 を追加する必要がある場合があります。DirectX の説明はここにあります。ただし、OpenGL のルールは異なる場合があります。
于 2010-04-27T20:35:51.720 に答える