OpenGLで大きな画像を表示するための好ましい方法は何ですか
質問
この問題は何度かありました。スプラッシュスクリーンまたは何かをOpenGLコンテキスト(または、その点ではDirectX、もっと概念的なもの)で表示したいとしましょう。それは(ほとんどの場合、私はそう思うだろうが)古い学校のグラフィックカードで成長していると、この悪い良心が私に寄りかかって、それほど大きなテクスチャを使用すべきではないと言っている。
最近の好ましい方法は何ですか?それをビデオメモリに詰め込んだり、タイル化したり、CPUに仕事をさせてglDrawPixelsを実行させたりするだけですか?それとももっと手の込んだものですか?
解決
これがアニメーションのない単一フレームのスプラッシュ画像である場合、 glDrawPixels
を使用しても問題はありません。パフォーマンスが重要で、テクスチャを使用する必要がある場合は、プロキシテクスチャを使用して、実行時にサポートされる最大テクスチャサイズを決定するのが正しい方法です。
GLint width = 0;
while ( 0 == width ) { /* use a better condition to prevent possible endless loop */
glTexImage2D(GL_PROXY_TEXTURE_2D,
0, /* mip map level */
GL_RGBA, /* internal format */
desiredWidth, /* width of image */
desiredHeight, /* height of image */
0, /* texture border */
GL_RGBA /* pixel data format, */
GL_UNSIGNED_BYTE, /* pixel data type */
NULL /* null pointer because this a proxy texture */
);
/* the queried width will NOT be 0, if the texture format is supported */
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
desiredWidth /= 2; desiredHeight /= 2;
}
システムのOpenGLドライバーでサポートされる最大テクスチャサイズがわかったら、画像が収まらない場合、少なくとも2つのオプションがあります。
- 画像タイル:画像をサポートされている小さなチャンクに分割した後、複数のクワッドを使用します。スプラッシュ画面のようなものの画像タイリングは、それほどトリッキーではないはずです。 glPixelStorei の< code> GL_PACK_ROW_LENGTH パラメータを使用して、大きな画像のセクションをテクスチャにロードします。
- 画像のサイズ変更:サポートされている最大テクスチャサイズに合わせて画像のサイズを変更します。これを行うGLUヘルパー関数もあります。 gluScaleImage 。
所属していません StackOverflow