0

頂点シェーダーでテクスチャを繰り返しています (その場で繰り返すのではなく、保存するため)。これは正しい方法ですか?どこか精度が落ちているようです。

varying vec2 texcoordC;

texcoordC = gl_MultiTexCoord0.xy;
texcoordC *= 10.0;
texcoordC.x = mod(texcoordC.x, 1.0);
texcoordC.y = mod(texcoordC.y, 1.0);

追加: 次に、texcoord を色で保存 (保存) し、テクスチャに出力して、後でそのテクスチャを再度使用します。テクスチャから色を取得すると、texcoords が見つかり、それらを使用して後処理でテクスチャを適用します。私がこのようにしたいのには理由があります。texcoords は色の精度によって制限されることがわかりました。これは、テクスチャの幅と高さが 256 であるため問題ありません。

私は通常、glTexcoord2f を使用して texcoords を 1.0 よりも高く設定して繰り返すことを知っていますが (GL_REPEAT を使用して)、編集するのが面倒なモデルローダーを使用しています。

4

1 に答える 1

1

これがうまくいかない可能性がある (少なくとも) 2 つの方法があります。

まず、はい、精度が失われます。浮動小数点数をスケールアップした後、基本的に浮動小数点数の小数部分を取得しています。これにより、本質的に数の一部が失われます。

第二に、これはおそらくほとんどの典型的な用途では機能しません。頂点ごとにテクスチャをタイル化しようとしていますが、テクスチャはポリゴン全体に補間されています。そのため、この手法では、同じポリゴンの異なる頂点で異なる方法でテクスチャをタイリングする可能性があり、その結果、混乱が生じます。

すなわち

頂点 1 の U が 1.5 (スケーリング後) で、頂点 2 の U が 2.2 の場合、補間によってこれらのポイント間の値が増加し、中間点の U が 1.85 になることが予想されます。

各頂点でモジュロを取ると、それぞれ U が 0.5、U が 0.2 になり、U が減少し、U が 0.35 の中間点になります...

テクスチャ/サンプラーでタイリングを有効にし、0->1 の範囲外の座標を使用するだけで、テクスチャをタイリングできます。サンプリングの精度を高め、大量のタイリングが必要な場合は、頂点ごとではなく、ポリゴン全体で UV 座標を均一にラップする必要があります。つまり、頂点シェーダーではなく、データで行います。

後で何らかの目的で UV 座標をバッファーに出力しようとしている場合、ピクセルシェーダーで UV をクランプ/ラップすることができます。したがって、頂点シェーダーで UV を乗算し、ポリゴン全体で正しく補間し、バッファーに書き込むときにのみモジュロを適用します。

ただし、すべてのサブピクセル情報が失われるため、精度の問題が発生すると思います。それがあなたが使っているテクニックの問題なのかどうかはわかりません。

于 2013-01-21T15:00:09.730 に答える