テクスチャのサイズについて疑問に思ったことがあります。
OpenGlなどの環境によっては画像サイズが2の2乗のサイズじゃないといけないことってありますよね?
あれって何か理由があるのでしょうか?
本などではあまり深いところまで書いてあるものを見たことがないので不思議でしょうがないです。
テクスチャのサイズについて
Re:テクスチャのサイズについて
コンピュータでは0か1の2通りすべてのものをあらわす。
だから2のn乗。
DXライブラリでもたとえば100*100の画像を読み込むと
96*96の画像1つと4*4の画像をたくさん組み合わせて
100*100になるようにみせてるって聞いたことがあるよ。
だから2のn乗。
DXライブラリでもたとえば100*100の画像を読み込むと
96*96の画像1つと4*4の画像をたくさん組み合わせて
100*100になるようにみせてるって聞いたことがあるよ。
Re:テクスチャのサイズについて
おっと恥ずかしい。
96*96の画像だったら
64*64の画像1つと32*32の画像3つにわけられる。
とかきたかったのです。
ほんとにお恥ずかしい
96*96の画像だったら
64*64の画像1つと32*32の画像3つにわけられる。
とかきたかったのです。
ほんとにお恥ずかしい
Re:テクスチャのサイズについて
画像の横幅が 2 のべき乗であると処理が高速化できるからじゃないでしょうか。
例えば 64*32 の画像の、ある一点(x,y)を調べるときには、pixels[(y << 6) + x] とすれば求められることになります。
これが 65*32 とかだった場合、pixels[(y * 65) + x] と、乗算を使うので効率が悪いです。
ただこれは横幅さえ 2 のべき乗であればいいので、縦幅も 2 のべき乗でないといけない理由は思いつかないですね(実際、縦は 2 のべき乗じゃなくてもテクスチャが作れる環境もあります)。
あと、手元の本によると、OpenGL 2.0 からは 2 のべき乗でないといけないっていう制限は無くなっているらしいのですけれども、ちゃんとは調べていないです。
>96*96の画像だったら
>64*64の画像1つと32*32の画像3つにわけられる。
画像を分けちゃうと拡大縮小とかする際に補間の処理を考えるのがかなり面倒なので、96*96 の画像なら、テクスチャは 128*128 の画像を用意するのが一般的だと思いますが、DXライブラリが分割しているというのであればすごいですね。
例えば 64*32 の画像の、ある一点(x,y)を調べるときには、pixels[(y << 6) + x] とすれば求められることになります。
これが 65*32 とかだった場合、pixels[(y * 65) + x] と、乗算を使うので効率が悪いです。
ただこれは横幅さえ 2 のべき乗であればいいので、縦幅も 2 のべき乗でないといけない理由は思いつかないですね(実際、縦は 2 のべき乗じゃなくてもテクスチャが作れる環境もあります)。
あと、手元の本によると、OpenGL 2.0 からは 2 のべき乗でないといけないっていう制限は無くなっているらしいのですけれども、ちゃんとは調べていないです。
>96*96の画像だったら
>64*64の画像1つと32*32の画像3つにわけられる。
画像を分けちゃうと拡大縮小とかする際に補間の処理を考えるのがかなり面倒なので、96*96 の画像なら、テクスチャは 128*128 の画像を用意するのが一般的だと思いますが、DXライブラリが分割しているというのであればすごいですね。
Re:テクスチャのサイズについて
3Dだとハードウェア側が2^nじゃないと動作しない場合があります
PSPでプログラムしてますがPSPもテクスチャは2^nじゃないとだめですし最大512までという制限もあります
PSPでプログラムしてますがPSPもテクスチャは2^nじゃないとだめですし最大512までという制限もあります
Re:テクスチャのサイズについて
> ただこれは横幅さえ 2 のべき乗であればいいので、縦幅も 2 のべき乗でないといけない理由は思いつかないですね(実際、縦は 2 のべき乗じゃなくてもテクスチャが作れる環境もあります)。
テクスチャ上のピクセル(テクセル?)座標(x,y)を求めるときに2^nサイズだとクリッピングをビットマスクで済ませることができるので高速に処理できます。
テクスチャ上のピクセル(テクセル?)座標(x,y)を求めるときに2^nサイズだとクリッピングをビットマスクで済ませることができるので高速に処理できます。
Re:テクスチャのサイズについて
うーん、if ((unsigned int)y < height) と if (!(y >> n)) でそんなに差が出るとは思えないのですけれども、CPU や GPU レベルで見ると大分変わってくるのでしょうかね。
Re:テクスチャのサイズについて
> if (!(y >> n))
テクセル座標を使うときに
ty = sy & ((1<<n)-1); // (1<<n)-1は事前に求めて使う
とすれば決してテクスチャをはみ出さないです。
ビット論理積演算ひとつですけど。
【編集】用語間違いを修正しました。

テクセル座標を使うときに
ty = sy & ((1<<n)-1); // (1<<n)-1は事前に求めて使う
とすれば決してテクスチャをはみ出さないです。
ビット論理積演算ひとつですけど。
【編集】用語間違いを修正しました。

Re:テクスチャのサイズについて
> タイル表示ってそんなによく使うのでしょうか?
「タイル表示」がどんなイメージを指すのかちょっと分からないのですが、UV座標が1.0を超えるとテクスチャが繰り返し現れるのが一般的だと思います。
「タイル表示」がどんなイメージを指すのかちょっと分からないのですが、UV座標が1.0を超えるとテクスチャが繰り返し現れるのが一般的だと思います。