2017-01-17 4 views
1

OpenGLでフォントをレンダリングしたい。私はすべての文字とテクスチャ上の数字のすべての位置が保存されるファイルを持つテクスチャを得ました。例えばOpenGLレンダリングフォントをインスタンス化

char id=40  x=167 y=0 width=21 height=74 xoffset=-3 yoffset=33 xadvance=59 page=0 chnl=0 
char id=41  x=188 y=0 width=21 height=74 xoffset=-3 yoffset=33 xadvance=59 page=0 chnl=0 

が、私は今、クワッド上にこれをレンダリングします。しかし、これはどのようにして正常に行われますか?各数字のレンダリングは1回ですか?または、数字をインスタンス化する必要がありますか?つまり、VBOにインスタンス化された属性としてテクスチャの座標とオフセットなどを格納することになります。 これは最も難しい解決策であり、より簡単でなければなりません。 1回のレンダリング呼び出しで、レンダリングに時間がかかりすぎる可能性があります。

私は新しいVAO + VBOが作成され、テキストの隣に四角形が表示されるという解決策を見てきました。そこでは頂点にtextureCoordsを格納しました。 これは非常に効果的ではありませんか?私はまた、私のテキストの内容を変更したい。

誰かが私の問題の良い解決策を知っていますか?

答えて

1

クワッドについて言及しているので、私はあなたが三角形のペアで作業していると仮定します。クワッドはOpenGL仕様から長い間非難されてきました。

レンダリングを設定するには、複数の横並びの長方形が含まれ、それぞれに1つの文字が投影されたバッファを作成することが考えられます。これは、VAO + VBOコンボを使用して行うことができます。それは私が個人的にこれを行う方法です。

頂点は同じものを共有するのではなく、異なるテクスチャ座標を持つ可能性が高いため、実際には座標を個別に定義する必要があります。それは実際には効率的ではありません。これは、OpenGLでレンダリングプロセスが実装されていることが原因です。

テキストをレンダリングする方法は、glBindTexture()を使用してフォントテクスチャをバインドすることです。次に、glBindVertexArray()を使用してVAOをバインドし、最後にglDrawElements()コールを使用して描画します。だから、あなたが必要とするmuichテキストのためにただ一つのdrawcallを発行するだけです。

ここで重要なことは、発行する描画呼び出しの回数を最小限に抑えることです。ドローコールは比較的高価ですので、適切にそれらを最小限に抑えるのが道のりです。これは、インスタンス化されたレンダリングが存在する理由です。ドローコールのオーバヘッドなしで正確に同じオブジェクトを複数回描画することができます。しかし、この場合は、すべてを単一のバッファに入れ、描画するために1回の描画呼び出しを発行する方がはるかに優れています。

+0

ありがとうございました。あなたが記述した方法を使用します:) – Luecx

+0

実際に、VAO + VBOコンボを使用してすべてのジオメトリを描画する必要があります。それは実際にジオメトリを効率的に描画するための最良の方法です。 – Bartvbl

関連する問題