16.78MHz -19ページ目
<< 前のページへ最新 | 15 | 16 | 17 | 18 | 19

GL_NV_texture_rectangle

GL_NV_texture_rectangle
GL_ARB_texture_rectangle

どちらも全く同じ拡張でglext.hで定義された定数も同じ値になっており、新しく定義される関数は無いため、一方に対応していれば自動的に他方にも対応しているはずなのだが、ATi RADEON9800ProはGL_ARB_texture_rectangle対応だがGL_NV_texture_rectangle非対応らしい。意地でもnVidia拡張対応であると言わないあたりにATiのこだわりを感じる( ところでGL_EXT_texture_rectangleがOpenGL Extension Registryに無いのはなんでー )。
fadis@Virginia[~] $ glxinfo |grep texture_rectangle
GL_ARB_texture_rectangle, GL_ARB_transpose_matrix, GL_ARB_vertex_blend,
GL_EXT_texture_object, GL_EXT_texture_rectangle, GL_EXT_vertex_array,
fadis@Virginia[~] $

OpenGLでは基本的にテクスチャの画素数は頂点にテクスチャ座標を割り当てる際には全く意識する必要が無く、どんなサイズのテクスチャであっても1辺の長さが1.0の浮動小数で表現される。ここで問題になるのが解像度を保証しなければならない場合( つまり、どんなテクスチャが割り当てられても面に並ぶテクセルの数を一定にしたいとき )だ。

これは貼りつけるテクスチャを変更するたびに、それに合わせてテクスチャ行列を調整することでも一応実現できるが、GL_NV( ARB )_texture_rectangleはそれをより簡単に実現する方法を提供し、ソースが魔法の呪文になるのを防ぐことができる。

この拡張の基本的な使いかたは至って簡単で、まずGL_TEXTURE_2DをGL_TEXTURE_RECTANGLE_NV( ARB )で置き換える。GL_TEXTURE_RECTANGLE_NV( ARB )のテクスチャ優先順位はGL_TEXTURE_2Dより上、GL_TEXTURE_3Dより下なのでGL_TEXTURE_RECTANGLE_NV( ARB )とGL_TEXTURE_2D両方にテクスチャをロードするとGL_TEXTURE_RECTANGLE_NV( ARB )が使用される。
このテクスチャターゲットではテクスチャ空間の( 0, 0 )から( x, y )の範囲にイメージが割り当てられる。したがって
glTexCoord2f( 32.0f, 20.0f );

とすればどんなテクスチャを読み込んでも( 32, 20 )テクセル目の画素がその頂点にくるようになる(勿論テクスチャが最低でも32x20テクセルのサイズを持っていることが前提である)。

GL_TEXTURE_RECTANGLE_NV( ARB )にはいくつか制約事項がある。まず、ミップマップは使えない。glTexImage2Dの第2引数は常に0でなければならない。さらに、境界線にも対応していない。glTexImage2Dの第6引数も常に0でなければならない。そして、繰り返し方法はGL_CLAMP, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDERのいずれかでなければならない( つまり繰り返しは出来ない )。

一方GL_TEXTURE_RECTANGLE_NV( ARB )はパフォーマンス面でのペナルティ無しで非二乗( non-power-of-two略してNPOT )テクスチャをロードすることが出来る
<< 前のページへ最新 | 15 | 16 | 17 | 18 | 19