OpenGL で簡単な GUI を作成しようとしています。写真を作成したので、参照して説明を簡単にすることができます。
ボタンのテクスチャ (32x32) を 120x20 のサイズの四角ポリゴン (つまり、テクスチャとしての長方形ではない) に適用すると、MLとMRが非常に太い線に引き伸ばされ、ボタンが見苦しくなります。セグメント ( TL、TM、TRなど)ごとに新しい四角ポリゴンを作成し、テクスチャの一部をそれぞれに適用することで、図に示すように歪みを回避できることがわかっています。
質問 1: ソース テクスチャの一部をクワッド ポリゴンの正確な位置に適用することはできますか? テクスチャのTL/ML/BL部分を取得して、クワッド ポリゴンの最も左側に垂直方向にストレッチして適用し、次にTM/MM/BMを取得して、前の部分のすぐ隣に水平方向にストレッチして適用できますか?等。?4つの頂点しか必要ないので、それは可能ですか?
- 言い換えれば、テクスチャの一部だけを伸ばすことはできますか? いくつかの部分を垂直に、いくつかの部分を水平に伸ばしてから、このマルチストレッチ テクスチャをポリゴンに適用しますか?
質問 #2: それが不可能な場合、必要な頂点の数を減らすにはどうすればよいですか? 9x4vert クワッドを作成するには 36 個の頂点が必要ですが、共有できるすべての頂点を共有するようにすると、この数を 16 個に減らすことができますか?
答え:
私は非常に長い間、すべてのインデックスと座標を手で描いて紙にまとめていました。これが誰かの役に立てば幸いです。私にとってはうまくいきますが、それが正しいことを願っています。これは C# ですが、C++ に翻訳するのは簡単です。
編集:私はずっと長く取り組んできましたが、これは 3x3 平面の最終的な頂点/インデックス配列です。
public Vector3[] VertexData = new[]
{
new Vector3(-1.0f, -1.0f, 0.0f),
new Vector3(-0.33f, -1.0f, 0.0f),
new Vector3(0.33f, -1.0f, 0.0f),
new Vector3(1.0f, -1.0f, 0.0f),
new Vector3(-1.0f, -0.33f, 0.0f),
new Vector3(-0.33f, -0.33f, 0.0f),
new Vector3(0.33f, -0.33f, 0.0f),
new Vector3(1.0f, -0.33f, 0.0f),
new Vector3(-1.0f, 0.33f, 0.0f),
new Vector3(-0.33f, 0.33f, 0.0f),
new Vector3(0.33f, 0.33f, 0.0f),
new Vector3(1.0f, 0.33f, 0.0f),
new Vector3(-1.0f, 1.0f, 0.0f),
new Vector3(-0.33f, 1.0f, 0.0f),
new Vector3(0.33f, 1.0f, 0.0f),
new Vector3(1.0f, 1.0f, 0.0f)
};
public Vector3[] NormalData = new[]
{
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f),
new Vector3(0f, 0f, 1f)
};
public Vector2[] TextureData = new[]
{
new Vector2(0.0f, 1.0f),
new Vector2(0.33f, 1.0f),
new Vector2(0.66f, 1.0f),
new Vector2(1.0f, 1.0f),
new Vector2(0.0f, 0.66f),
new Vector2(0.33f, 0.66f),
new Vector2(0.66f, 0.66f),
new Vector2(1.0f, 0.66f),
new Vector2(0.0f, 0.33f),
new Vector2(0.33f, 0.33f),
new Vector2(0.66f, 0.33f),
new Vector2(1.0f, 0.33f),
new Vector2(0.0f, 0.0f),
new Vector2(0.33f, 0.0f),
new Vector2(0.66f, 0.0f),
new Vector2(1.0f, 0.0f)
};
public UInt32[] IndicesData = new UInt32[54]
{
0, 1, 5,
0, 4, 5,
1, 2, 6,
1, 5, 6,
2, 3, 7,
2, 6, 7,
4, 5, 9,
4, 8, 9,
5, 6, 10,
5, 9, 10,
6, 7, 11,
6, 10, 11,
8, 9, 13,
8, 12, 13,
9, 10, 14,
9, 13, 14,
10, 11, 15,
10, 14, 15
};