3

私の質問は、テクスチャ座標がテクスチャ内のテクセルに正確にマップされる方法に関するものです (フィルタリングを考慮していません)。

たとえば、(0,0) は左上のピクセルの左上隅を指しますか、それとも左上のピクセルの中心を指しますか?

近フィルタリングを使用している場合、テクスチャ座標 (0.5,0.5) で取得されるピクセルは?

(1.0,1.0) はどうですか? 右下のピクセルの右下隅を指しますか、それとも右下のピクセルの左上隅を指しますか? (数年前、これは一部の 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)));

?

多分誰かがマッピングが正確にどのように機能するかを明確にすることができますか?

4

1 に答える 1

6

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

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

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

これはそれをより視覚的に説明します: 4 テクセルのテクスチャ補間

ご覧のとおり、[0,0] のテクセルは [0.125,0] と [0.875,0] の線形混合であり、この例では [1,1] に等しくなります。

DelphiGL Wikiで非常によく説明されているすべてのこと(英語の翻訳)

最初は混乱させてすみません。

于 2012-03-22T11:25:34.057 に答える