[トップページ] [星雲紀行] [MLXS] [WPGen] [自作音楽] [モデル] [vi/vim] [tips] [自己紹介]

テクスチャマッピング

目次

  1. このページは
  2. テクセル
  3. テクスチャ座標
    1. テクセル座標とテクスチャ座標
    2. OpenGL
    3. DirectX
  4. LOD
    1. MIPMAP
    2. LOD 参考
  5. フィルタリング
    1. a
  6. スフィアマッピング
  7. キューブマッピング
    1. hdr 画像をキューブマップdds ファイルに変換する方法
  8. ボリューム(3次元)テクスチャ
    1. ボリュームテクスチャデータ
  9. アドレシング
    1. ラップモード
  10. opengl
  11. tips
    1. ガンマ補正
    2. _
  12. 素材集
  13. 参考文献・参考ウェブページ
  14. 履歴

このページは

テクスチャマッピング技術について。

[content]

テクセル

テクセルはテクスチャの画素をあらわす単位。texel, textures element。
フレームバッファの画素をあらわす言葉はピクセル(pixel, pictures element)。
3 次元のテクスチャの場合は画素の単位をボクセルと呼ぶ。voxel, volumetric pixel。

[content]

テクスチャ座標

テクスチャ座標は扱うライブラリで一致しているとは限らないので注意。
同じテクスチャ座標を指定しても反転した出力になる。

テクセル座標とテクスチャ座標

テクスチャ座標は0.0f から1.0f の範囲がテクスチャの0 からサイズ長までに割り当てられる。
例えばテクスチャサイズが256x256 の場合にはテクスチャ座標の(0.0f, 0.0f)はテクセルの(0, 0)に対応し、テクスチャ座標の(1.0f, 1.0f)はテクセルの(255, 255)に対応する。
このときのテクスチャの実データのインデックスをテクセル座標という。
テクセル座標に変換したときにでる小数部はLINEAR 補間時のブレンド比に使用される。

テクスチャサイズをTEXTURE_SIZE としたときの対応まとめ

テクスチャ座標(浮動少数) テクセル座標(整数)
はじめ 0.0f 0
半分 0.5f (TEXTURE_SIZE-1)/2
最大 1.0f TEXTURE_SIZE-1
[content]

OpenGL

(u,v)

           (1,1)
     +------+
     | tex  |
     |      |
     +------+
(0, 0)

http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040917

[content]

DirectX

(0, 0)
     +------+
     | tex  |
     |      |
     +------+
           (1,1)
[content]

LOD

LOD はLevel Of Detail の略。
テクスチャをポリゴンに張るときにマッピングの面積比を考慮して処理量を減らすためのアルゴリズム。
モデルデータをレンダリング量に応じて荒いモデルデータに差し替えることはモデルLOD といい、テクスチャのLOD 処理とは異なる。
処理量を減らすという意味では同じ。

テクスチャマッピング時に対象のポリゴンが数ピクセルにもかかわらず多くのテクセルをロードするのは無駄が発生する。
そのため、ミップマップを作成して、詳細度に応じたテクスチャを使用するようにする。
計算方法はテクスチャマッピングをするときのuvp のテクスチャ座標の隣接ピクセルとの差分値を計算し、その量によりLOD の値を決める。
このときに画面のXY 軸に沿って隣接ピクセルを求める。(d/dx, d/dy)

Screen Coordinates
	+------+------+------+------+------+------+--
	|(0,0) |(1,0) |(2,0) |(3,0) |(4,0) |      | 
	+------+------+------+------+------+------+--
	|(0,1) |(1,1) |(2,1) |(3,1) |(4,1) |      | 
	+------+------+------+------+------+------+--
	|(0,2) |(1,2) |(2,2) |(3,2) |(4,2) |      | 
	+------+------+------+------+------+------+--

例えば(x,y) のLOD を求めるのであればそのピクセルのテクセル空間との比を求めるためには、 隣接ピクセル(x-1, y-1) (x, y-1) (x+1, y-1) (x-1, y) (x, y) (x+1, y) (x-1, y+1) (x, y+1) (x+1, y+1) 等に割り当てられた ラスタライズ後のテクスチャ座標の差分値を見ると比が割り出せる。

しかし実際には上記のように対象ピクセルの3x3 の範囲から1ピクセルのLOD を求めるのではなく、まとめて2x2 ピクセルの範囲でLOD を算出するのが現在の一般的なグラフィクスチップの標準的な機能になっている。
OpenGL の仕様書にはインプリメントの式がでており、この式がそのままハードウェアに実装されていることが多い。
このどれだけピクセル空間とテクセル空間のマッピングの比があるのか、ということは計算の精度と演算器のトレードオフがあるため、さまざまな最適化がいろんなGPU にインプリメントされている。

単純にZ (どれだけ視点からポリゴンが離れているのか)からLOD を算出する方法(PS2)もあれば、1 ピクセル単位でなるべく正確に計算する方法(Shader でPerPixelShading)もある。

[content]

MIPMAP

上記のLOD の値を算出した後、なるべくテクスチャのロードを抑えるために利用できるのがMIPMAP 処理。
テクスチャをあらかじめ縮小した状態でプリレンダーしてメモリに配置しておき、必要な解像度に応じて縮小されたテクスチャを用いる。
このMIPMAP の生成方法は一般的には幅、高さを1/2 (面積的には1/4)ずつ縮小しておくことだが、この部分も実際の処理には演算器と精度のトレードオフがあるため、さまざまな方法がある。

標準的な1/4 方式のMIPMAP であれば、例えば256x256 のサイズの2D テクスチャであれば以下のようになる。
256x256 (mipmap level 0)
128x128 (mipmap level 1)
64x64 (mipmap level 2)
32x32 (mipmap level 3)
16x16 (mipmap level 4)
8x8 (mipmap level 5)
4x4 (mipmap level 6)
2x2 (mipmap level 7)
1x1 (mipmap level 8)

標準的な1/4 方式のMIPMAP であれば、例えば128x128x128 のサイズの3D テクスチャであれば以下のようになる。
128x128x128 (mipmap level 0)
64x64x64 (mipmap level 1)
32x32x32 (mipmap level 2)
16x16x16 (mipmap level 3)
8x8x8 (mipmap level 4)
4x4x4 (mipmap level 5)
2x2x2 (mipmap level 6)
1x1x1 (mipmap level 7)

標準的な1/4 方式のMIPMAP であれば、例えば128x128x128 のサイズのテクスチャアレイであれば以下のようになる。
なお、このテクスチャアレイは2006/10 現在ハイエンドのGPU にインプリメントされており、DIRECTX10 の新機能である。
1つのテクスチャID に対して同じ幅高さのテクスチャをグループ化して扱える点で便利だが、基本的には2D テクスチャの羅列と変わらない。
128x128x128 (mipmap level 0)
64x64x128 (mipmap level 1)
32x32x128 (mipmap level 2)
16x16x128 (mipmap level 3)
8x8x128 (mipmap level 4)
4x4x128 (mipmap level 5)
2x2x128 (mipmap level 6)
1x1x128 (mipmap level 7)

+------------+
|            |
|            |
|            | MIPMAP LEVEL 0(original)
|            |
|            |
+------------+
+------+
|      |
|      |       MIPMAP LEVEL 1
|      |
+------+
+--+
|  |           MIPMAP LEVEL 2
+--+
++             MIPMAP LEVEL 3
++

例えば、精度を上げるためには、縮小率は1/4 ずつにする必要はない。1/3 単位でも良いしもっと中途半端でも精度のためには問題ないが、コンピュータの性質上、2 のべき乗だと計算にシフトが使用できるため、高速に実行できる都合から1/4 の比が良く使われている。
また、縦と横を一様に縮小する必要もない。縦と横を個別に半分にしていく方法がRIPMAP という手法。特殊な手法でSiggraph の昔の論文で見ただけの方法。

+------------++-------++----++-++
|            ||       ||    || ||
|            ||       ||    || ||
|            ||       ||    || ||
|            ||       ||    || ||
|            ||       ||    || ||
+------------++-------++----++-++
+------------++-------++----++-++
|            ||       ||    || ||
|            ||       ||    || ||
|            ||       ||    || ||
+------------++-------++----++-++
+------------++-------++----++-++
|            ||       ||    || ||
+------------++-------++----++-++
+------------++-------++----++-++
+------------++-------++----++-++
[content]

LOD 参考

[content]

フィルタリング

テクセルをピクセル空間へ射影するときに、当該座標のピクセルに対応するテクセルの比に応じて複数テクセルを参照してピクセルへのデータを作成する。

一般的なものは、要求されるテクスチャ座標にたいして常に決まった値を出力する等方性フィルタ。

  • ピクセル空間のテクスチャ座標が参照している一番近いテクセル空間の値を参照するNEAREST フィルタ
  • ピクセル空間のテクスチャ座標が参照している一番近いテクセル空間4 近傍の値を参照し、座標値に応じた補間処理を行うLINREARフィルタ(バイリニアフィルタ、縦・横の2段階補間を行うからバイリニア補間)
  • ピクセル空間のテクスチャ座標が参照しているMIPMAP を含めた一番近いテクセル空間4 近傍の値を参照し、座標値に応じた補間処理を行うLINREAR_LINEAR フィルタ(トライリニアフィルタ、縦・横・MIP間の3段階補間を行うからトライリニア補間)

発展したフィルタ方法として、要求されるテクスチャ座標とピクセル空間に対してテクセル空間が対応している範囲(フットプリント)に応じて参照するテクセルの数を計算する、異方性フィルタがある。

参照するテクセルの数が大きくなるにつれて性能は落ちるため、出力の品質は処理時間とのトレードオフが必要になる。

テクスチャフィルタまとめ。
frac は小数部取得(fmod%1)。round は四捨五入。roundup は切り上げ。rounddown は切り下げ。
記載しているのは一次元の処理。これは2次元でも3次元でも同様になる。

計算式
NEAREST texel_coord = round(texture_coord*TEXTURE_SIZE);
color = texel[texel_coord];
LINEAR texel_coord_0 = rounddown(texture_coord*TEXTURE_SIZE);
texel_coord_1 = roundup(texture_coord*TEXTURE_SIZE);
texel_coord_weight = frac(texture_coord*TEXTURE_SIZE);
color = texel[texel_coord_0]*texel_coord_weight + texel[texel_coord_1]*(1.0f - texel_coord_weight);
[content]

スフィアマッピング

スフィアマッピングは2次元テクスチャに周囲を映しこんだ画像を作成してテクスチャマッピングする手法。
環境マップなどに用いられる。
テクスチャマッピング時には周囲を映し込んだ曲率を考慮したテクスチャ座標の生成式が必要になる。

[content]

キューブマッピング

キューブマッピングは6面体のテクスチャ(キューブマップ)を作成し、3次元のテクスチャ座標を使ってテクスチャマッピングを行う手法。
環境マップなどに用いられる。

hdr 画像をキューブマップdds ファイルに変換する方法

この手法ではhdr のダイナミックレンジはなくなってしまうので注意が必要。
dds はFP32,FP16にも対応しているので、もっといい方法はないか。

  1. hdr shop でhdr をbmp に変換
  2. convert -rot 90 してクロスを縦長にする。何のツールでも良いので時計回り90 度回転。
  3. cubemapgen でcubemap cross をロードする。
  4. cubemapgen でdds 出力する。
[content]

ボリューム(3次元)テクスチャ

ボリュームテクスチャは3次元のデータをテクスチャとして使用する手法。
主な用途に炎、ノイズ、雲など、プロシージャルテクスチャのリソースとなる場合が多い。
3Dテクスチャ、ボリュームテクスチャ、など。

ボリュームテクスチャデータ

RAWデータ http://www.gris.uni-tuebingen.de/areas/scivis/volren/datasets/datasets.html

[content]

アドレシング

テクスチャのアドレシングについて。

テクスチャの指定には例えばOpenGL では以下のような関数で一緒にテクスチャ設定を指定する。

void glTexImage2D(
		GLenum target,
		GLint level,
		GLint components,
		GLsizei width,
		GLsizei height,
		GLint border,
		GLenum format,
		GLenum type,
		const GLvoid *pixels);
[content]

ラップモード

テクスチャのラップモードについて。
テクスチャデータを繰り返したりクランプしたりするときに使う。
通常指定が必ず必要になる処理。

ラップモード ラップ範囲 説明
クランプ OpenGL はテクスチャ座標が0.0 から1.0 にクランプされる。
LINEAR 補間時にエッジ部分にボーダテクスチャ色が入ってしまうので注意。
クランプトゥーエッジ
この処理はテクセル座標で(0.5f, TEXTURE_SIZE - 0.5f)に対応する。
クランプの際のボーダ色が入ることを排除したモード。
テクスチャ座標はボーダ色が入らないようになる。
DirectX ではクランプもこのモードに含まれる。
クランプトゥーボーダカラー
クランプの際にテクスチャ座標0.0f から1.0f の範囲外には固定の色を指定する。
テクスチャをルックアップテーブルとして用いるときなどに範囲外エラーとして使ったりできる。
クランプトゥーボーダテクスチャ
クランプの際にテクスチャ座標0.0f から1.0f の範囲外にはボーダテクスチャを指定する。
ボーダテクスチャはテクスチャに余分な1 テクセルをもつ。
これは複数のテクスチャを張り合わせて使うときに張り合わせ部分のLINEAR 補間がうまくいかなくなることを防ぐ。
Google Map, Google Earth などで用いられると境目が見えなくなる。実際に使われているような感じがするが実際は未確認。
昔テクスチャの最大値が512x512 など小さな範囲しか持っていないときに張り合わせて大きなテクスチャを使うことができる。
リピート テクスチャ座標は0.0f から1.0f を繰り返す。
テクスチャを繰り返し使用する。
ミラーリピート
テクスチャ座標を0.0f から1.0f, 次に1.0f から0.0f を繰り返す。
ミラーリピートワンス
テクスチャ座標を0.0f から1.0f, 次に1.0f から0.0f を一度だけ繰り返す。
[content]

OpenGL

OpenGL でテクスチャを扱うときにDDS を使うと複雑なフォーマットに対応できて便利。
http://www.codesampler.com/oglsrc/oglsrc_4.htm#ogl_dds_texture_loader 単純なテクスチャ(RGB)であればPPM, TGA などRAW データの形式が扱いやすい。

[content]

tips

ガンマ補正

rgb からsrgb への変換をする。
また逆の変換もガンマ補正と言うこともあるようだ。
γ値はDirectX など一般的に2.2 が標準らしい。 画像処理フィルタではγ値を自由に変えられる。

http://mikeneko.creator.club.ne.jp/~lab/grp/png/

http://tomato.sakura.ne.jp/~hiropon/lecture/gamma.html
http://ew.hitachi-system.co.jp/w/E382ACE383B3E3839EE8A39CE6ADA3.html
http://www.geocities.jp/oredisc/memo/gamma/gamma.html

[content]

_

[content]

参考文献・参考ウェブページ

[content]

履歴

ご意見、ご感想、誤字、間違い等、お気づきの点がありましたら KGussan@Gmail.com まで連絡ください。
このウェブページの注意・免責事項 Copyright (C) 2004-2012 KGussan. [トップページ]
[PR:元国税局勤務の起業家向け、遺産相続の相談なら植村洋税理士事務所:一時間無料税理士相談。お気軽に。]