1

テクスチャがマッピングされたビルボードクワッドがあります。

これは基本的に透明性のあるテキストです。

ビルボードは、カメラの視点から前後に浮きます。

ビルボードが離れる(そして小さく見える)と、実際のテクスチャにストロークの境界があるテキストのエッジの周りにちらつき効果があります。

これは、通常Xピクセル幅の画像がXの%としてのみ表示され、一部のピクセルをマージする必要があるため、補間が必要なためだと思います。私はそれが最も近い隣人か何かをしていると思いますか?誰かがこれを制御するためのopengl設定の正しい方向に私を向けることができますか?テクスチャの処理方法を調整することで、この影響が発生しないようにする方法があると思いますか?

私はそれが何かと関係があると思います:

GL_NEAREST_MIPMAP_NEAREST

しかし、これをMINフィルターに設定し、ミップマッピングを有効にしようとすると、テクスチャが非常にブロック状になり、ぼやけてしまいます...

私も試しました:

GL_LINEAR_MIPMAP_LINEAR

これは明らかにMINフィルターのトリリアーフィルターですが、表示すると画像が非常にぼやけます。(非常に低解像度のテクスチャのように見えます)私が間違っていることについて何か考えはありますか?

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // trilinear

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

その他のコード:

// Allocated memory needed for the bitmap context
spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
// Uses the bitmap creation function provided by the Core Graphics framework. 
spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width * 4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the sprite image to the context.
CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage);
// You don't need the context at this point, so you need to release it to avoid memory leaks.
CGContextRelease(spriteContext);

// Use OpenGL ES to generate a name for the texture.
glGenTextures(1, &spriteTexture[textureCount-1]); 

// Bind the texture name. 
glBindTexture(GL_TEXTURE_2D, spriteTexture[textureCount-1]);


glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



// Specify a 2D texture image, providing the a pointer to the image data in memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
// Release the image data
free(spriteData);

テクスチャは512x512です。

MINフィルターを使用した場合のぼやけの例:

ぼやけた看板

最小フィルターにGL_NEARESTを使用する場合、縮小としてアニメーション化すると、上記のようにシャープで厄介な双線形とちらつきが発生します。

GL_NEAREST

4

2 に答える 2

1

ミップマッピングは、描画されるフラグメントのピクセルに対するテクセルの比率によって制御されます(私の用語が正しいことを願っています)。画面にどのくらいの大きさで描いていますか?

(たとえば)128x128で描画している場合は、ミップマップレベル2が得られるため、ぼやけます。

テクスチャは、あまりにも多くのピクセルを生成してGPUに不適切なミップマップレベルを選択させるのではなく、画面に表示されるサイズ、または可能な限り近いサイズで作成する必要があります...

于 2010-05-11T20:09:55.227 に答える
1

gluを使用している場合は、gluBuild2DMipmapsを使用してミップマップを作成し、他の人がこれをどのように行うかを確認することをお勧めします。

glu関数の使用を避けるために、私は時々MesaのOpenGL実装を見て、いくつかのアイデアを得ます(私は通常、自分のプロジェクトに多くのコードを保持しようとします。そして、OpenGL、D3D、および他のプラットフォーム間で多くのコードを共有します)。gluBuild2DMipmapsのMesa実装(MesaLib)のソースを調べて、同様の効果を得る方法を確認できます。これはMesaLibのmipmap.cに表示され、おそらくbitmapBuild2DMipmapsの実装にジャンプすることになります。

これが良い結果につながることを保証することはできませんが、それは探求する道です。何が起こっているかを一般的にデバッグするために、ミップマップテクスチャをファイルに出力して外部から表示することもできます。もちろん、これはすべて、フラグをランダムに切り替えたり、他の人のコードをグーグルで調べたりして、状態関数を見逃していないかどうかを確認するオプションを使い果たした後です。

于 2010-05-08T20:57:35.747 に答える