18

テクスチャ アトラスの選択を繰り返すにはどうすればよいですか?

たとえば、スプライト (選択) はテクスチャ座標内にあります。

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

次に、そのスプライトを次のように定義された三角形のストリップ (またはクワッド) にN 回繰り返します。

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

何か関係がGL_REPEATあり、 textureCoords が range を通過することはわかっています[0,1]。ただし、これは機能しません: (N = 10 を繰り返そうとしています)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

フル テクスチャ アトラスが繰り返されています...

どうすればこれを正しい方法で行うことができますか?

4

7 に答える 7

19

質問で説明されている方法では実行できません。OpenGL のテクスチャ座標モードは、テクスチャ全体にのみ適用されます。

通常、テクスチャを繰り返すには、テクスチャが意味するよりも「大きい」ポリゴンを描画します。たとえば、より大きな領域で何回か (たとえば 6 回) 繰り返したい正方形のテクスチャがある場合、高さの 6 倍の幅の長方形を描画します。次に、テクスチャ座標を (0,0)-(6,1) に設定し、テクスチャ モードを「繰り返し」に設定します。ポリゴンを横切って補間する場合、1 を超えるテクスチャ座標は、繰り返しが有効になっているため、テクスチャ内で「ラップ アラウンド」し、テクスチャが四角形全体に 6 回マッピングされます。

テクスチャ ラップ モードのいずれも、質問で説明されている種類の操作をサポートしていません。つまり、それらはすべて、任意のサブセットではなく、完全な [0,1] 範囲にマップされます。テクスチャの一部だけを使用してテクスチャリングしている場合、OpenGL がサブ長方形内でのみそれを繰り返すような方法で、より大きなテクスチャ座標を指定する方法はありません。

基本的に 2 つの選択肢があります。既存のテクスチャから必要なスプライトのみを持つ新しいテクスチャを作成するか、テクスチャ座標を適切にマッピングする GLSL 頂点プログラムを記述します。

于 2009-03-19T15:28:54.120 に答える
6

私はあなたがそれを行うことができるかどうかわからない。OpenGL のテクスチャ座標モードは、テクスチャ全体にのみ適用されると思います。アトラスを使用する場合、「サブテクスチャ」を使用しているため、テクスチャ座標が 0 と 1 に近づかないようにします。これは、ラッピングとクランプが発生する通常の制限です。

これに対処するための拡張機能があるかもしれませんが、私は確認していません。

編集: 通常、テクスチャを繰り返すには、テクスチャが意味するよりも「大きい」ポリゴンを描画します。たとえば、より大きな領域で何回か (たとえば 6 回) 繰り返したい正方形のテクスチャがある場合、高さの 6 倍の幅の長方形を描画します。次に、テクスチャ座標を (0,0)-(6,1) に設定し、テクスチャ モードを「繰り返し」に設定します。ポリゴンを横切って補間する場合、1 を超えるテクスチャ座標は、繰り返しが有効になっているため、テクスチャ内で「ラップ アラウンド」し、テクスチャが四角形全体に 6 回マッピングされます。

これは、画像なしで説明するのは少し大雑把です。

とにかく、テクスチャの一部だけを使用してテクスチャリングする場合、OpenGL がサブ長方形内でのみそれを繰り返すような方法で、より大きなテクスチャ座標を指定する方法はありません。

于 2009-03-19T13:40:15.107 に答える
5

テクスチャ ラップ モードのいずれも、探している種類の操作をサポートしていません。つまり、それらはすべて、任意のサブセットではなく、完全な [0,1] 範囲にマップされます。基本的に 2 つの選択肢があります。既存のテクスチャから必要なスプライトのみを持つ新しいテクスチャを作成するか、GLSL ピクセル プログラムを記述してテクスチャ座標を適切にマッピングします。

于 2009-03-19T14:03:03.603 に答える
1

これは古いトピックかもしれませんが。これが私がそれをやった方法です:

回避策は、複数のメッシュを作成し、テクスチャ UV のサブセットを含むように接着することです。

例: U[0.05 - 0.1] & V[0.05-0.1] で、より大きなテクスチャ アトラス内にレーザー テクスチャが含まれています。

次に、それぞれが U[0.05-0.1] と V[0.05-0.1] 座標を持つ N 個のメッシュを作成します。(N = length / texture.height。高さは、繰り返したいテクスチャの寸法です。または、簡単に言えば、テクスチャを繰り返したい回数です。)

このソリューションは、テクスチャを次々とリロードするよりも費用対効果が高くなります。特に、すべてのレンダリング呼び出しをバッチ処理する場合 (必要に応じて)。

(OpenGL ES 1.0、1.1、2.0 - モバイル ハードウェア 2011)

于 2011-12-09T11:48:42.237 に答える
-3

できない...

于 2009-03-19T13:58:54.393 に答える