1

opengl で単純な 3D 配列の視覚化を作成しようとしています。3D 配列には色の値が含まれています。これを実現するには、たくさんの立方体を描画して、正しいテクセルを指すテクスチャ座標を与えます。さて、試してみましたが、うまくいきます。しかし、もっと多くのことが必要です。私が望むものを達成する唯一の方法は、平面がオンになっているときにすべてのグリッドで他の軸方向に完全な 2D 平面を描画し、これを 6 方向にすることです。たとえば、-15 から +15 までの XY 平面を Z 座標 -15 から +15 で描画し、これを背面 XY 平面、YZ 平面、背面 YZ 平面などに対しても行います。このようにして、すべてのコーナーに 3D テクスチャ座標を配置するだけで、あとは補間で処理できます。

0 から 32 の間の配列座標をテクスチャ座標として取得しました。これは、シェーダーでテクスチャ座標を床に落としてから 32 で除算して、グリッド上のすべてのピクセルの正確なテクセルを取得できるためです。 .

しかし悲しいかな... ピクセル シェーダーは常に選択肢を疑っています。あるピクセルが次のピクセルとは異なるテクセルにマップされ、次の次のピクセルが再び正しくマップされます。

以前は、浮動小数点数に 0.5 または 0.35 を追加して、すべてのハードウェア プラットフォームで浮動小数点数が正しく丸められるようにすることで、この種の問題を解決していましたが、それでも私にはハックのように思えます。また、3D テクスチャでは機能しません。

誰かがこれを処理する方法を教えてもらえますか?

4

1 に答える 1

6

誰かがこれを処理する方法を教えてもらえますか?

悪名高いフェンスポスティングの問題に直面しています。簡単に言うと、テクスチャ座標 0 と 1 はピクセルの中心ではなく、ピクセルの境界です。この簡単なスケッチを見てください

  | 0 | 1 | 2 | 3 |
  ^               ^
 0.0             1.0

  0   1   2   3   4
 --- --- --- --- ---
  4   4   4   4   4

したがって、幅N (たとえば 4) ピクセルのテクスチャのピクセルi (たとえば 0)をアドレス指定するには、テクスチャ座標を使用する必要があります。

(i/N + (i+1)/N)/2 = i/2N + (i+1)/2N = (2i + 1) / 2N = (i + 0.5)/N

したがって、その 0.5 を追加することはハックではありません。ただし、シェーダーtexelFetchでは、サンプリング座標ではなく、絶対ピクセルでテクスチャをアドレス指定するために使用できます。ただし、フィルタリングを自分で実装する必要があります。

于 2013-07-02T10:14:23.097 に答える