1

OpenGL で簡単な GUI を作成しようとしています。写真を作成したので、参照して説明を簡単にすることができます。

テクスチャ マップ

ボタンのテクスチャ (32x32) を 120x20 のサイズの四角ポリゴン (つまり、テクスチャとしての長方形ではない) に適用すると、MLMRが非常に太い線に引き伸ばされ、ボタンが見苦しくなります。セグメント ( TLTMTRなど)ごとに新しい四角ポリゴンを作成し、テクスチャの一部をそれぞれに適用することで、図に示すように歪みを回避できることがわかっています。

歪んだテクスチャ

質問 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
                                      };
4

3 に答える 3

2

セグメント (TL、TM、TR など) ごとに新しい四角ポリゴンを作成し、テクスチャの一部をそれぞれに適用することで、図に示すように歪みを回避できることがわかっています。

そして、それはまさにあなたがすべきことです。

質問 #2: それが不可能な場合、必要な頂点の数を減らすにはどうすればよいですか?

もちろん、エッジが交わる頂点を共有する必要があります。これは、テクスチャ マッピングがそこで連続しており、1 次導関数のみが変更されるためです。これは完全に順序どおりです。

于 2012-08-09T13:24:07.360 に答える
1

テクスチャの一部を伸ばすという話は聞いたことがありません。あなたの場合、MLMRが引き伸ばされるだけでなく、MMも引き伸ばされます。MMは単色なので目立ちません。

あなたの問題について...あなたが投稿した写真のように、ボタンのポリゴンを9つのクワッドに分割できますか? 次に、テクスチャをスライスして、そのさまざまな部分をさまざまなクワッドに適用できます。現時点で思いつくのはこれだけです。

質問 2 について - 頂点バッファとインデックス バッファを確認する必要があると思います。基本的に、頂点バッファーはすべての一意の頂点のバッファーであり、インデックス バッファーは、頂点バッファーからの頂点のインデックスを、三角形を組み立てたときに表示される順序で保持します。インデックス バッファでは、インデックスが複数回出現する可能性があります (これがこのバッファの目的です。同じ頂点が複数回存在することはありません)。

于 2012-08-09T13:13:07.100 に答える
0

それぞれテクスチャ座標を持つ 4 つのポイントで OpenGL ポリゴンを描画する代わりに

テクスチャのどの部分が引き伸ばされるかを制御できるように、より多くのポイントで作成してみてください。画像を参照すると、OpenGL で 9 つの長方形を作成して、余白の拡大を避けることができます。

于 2012-08-09T13:25:57.010 に答える