2012-03-22 22 views
1

私の質問は、どのようにtexturecoordinateがテクスチャ内のテクセルに正確にマッピングされるか(フィルタリングを考慮しない)です。GLSLテクスチャ座標を絶対ピクセルに変換しますか?

たとえば、(0,0)は左上のピクセルの左上隅を参照するか、左上のピクセルの中心を参照しますか?

ニアフィルタリングを使用している場合、テクスチャ座標(0.5,0.5)でどのピクセルがフェッチされますか?

右下のピクセルの右下隅、または右下のピクセルの左上隅を基準にしていますか? (ATIとNVIDIAのカードの違いは数年前のことですが、現在は標準化されていますか?)

textureLod()の代わりにtexelFetch()を使用する場合は、

ivec2 size = textureSize(sampler,0); 
ivec2 iCoords = ivec2(int(uv.x*size.x),int(uv.y*size.y)); 
vec4 col = texelFetch(sampler,iCoords); 

あるまたは多分

ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f)); 

正しいのですか?

あるいは

ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1))); 

誰かがマッピングがどのように正しく動作するかを明確にすることができますか?

+0

これはよくある質問です。私はそれを数回ここで答えていたStackOverflow.com http://stackoverflow.com/a/7272871/524368 http://stackoverflow.com/a/5879551/524368 – datenwolf

答えて

5

あなたの質問が単に好奇心から外れている場合:AFAIKでは、その質問に対する標準的な答えはありません。テクスチャ座標は1.0で終わらなければならないので、必要ありません。また、グラフィックカードは異なる方法で値を処理します(現在、一部のグラフィックカードは現在64ビットFP-Opsをサポートしています)。私は、あなたが常に安全な側でコード化しようとする必要があり、適用可能であれば1.0の代わりに0.999を使用するかもしれないと思います。

レンダリングされたテクスチャからピクセルを読み取る方法をお探しの場合は、the website of dominik göddeke on gpgpuの説明に従ってビューポートを定義することができます。ビューポートをテクスチャのサイズに設定すると、ピクセルを元の座標に戻すことができます。私は本当にサイトをお勧めします、それは私をたくさん助けました。

更新: GL_REPEATを使用すると、テクスチャ座標はテクスチャの最初と最後のピクセルの間で補間されます。したがって、4テクセルテクスチャの最初のピクセルの中心は、各ピクセルが0.25または1/4の幅を持つため、0.125になります。

これは、より視覚的にそれを説明する: Texture interpolation on 4 texels

あなたが見ることができるように、[0,0]でテクセル[1への線形[0.125,0]と[0.875,0]のミックスと同じです、1]となる。

すべてのこと

は非常によく、私は最初は混乱ごめんなさい DelphiGL Wikienglish translation

に説明されています。

+0

それは、ピクセルの中心にreferes場合は、次に、例えば(-0.0001、-0。0001)はまだtopLeftPixelを参照しますか? (テクスチャラッピングが有効でテクスチャが小さいと仮定して) – user1282931

+0

mmmh - これが真であれば、角の頂点にuv座標(0,0)〜(1,1)のクォードを作成してテクスチャを作成しますテクスチャの境界テクスチャの半分しか表示されませんでした.... – user1282931

+0

それは 'GL_TEXTURE_WRAP_S/T'パラメータに依存します。 'GL_REPEAT'と' GL_LINEAR'を有効にした場合、(-0.0001、-0.0001)は(texsize_x、texsize_y)で最小限補間されます。 'GL_NEAREST'を有効にしても、テクスチャの色は(0,0) – devsnd

関連する問題