2010-12-03 14 views
4

OpenGLで32x32ビットマップのキューブモデルを作成したいと思います。たとえば、Super MarioのBob-ombの2Dビットマップが与えられた場合、結果は次のようになります。http://fc02.deviantart.net/fs49/f/2009/186/f/a/Bob_omb_in_Minecraft_by_Luafox.pngビットマップの各2Dピクセルを3Dキューブとして表現することが考えられます。2Dビットマップを3Dキューブモデルに変換する効率的な方法はありますか?

各モデルはゲームの敵を表しますので、私はこれらを素早くレンダリングできる必要があります。これを行う良い方法は何でしょうか?

まず、32x32x2の頂点グリッドを作成し、その後、これらの頂点から適切な場所に三角形を作成してキューブ面を形成することによって、ビットマップから静的な3Dモデルを生成します。私が持っている1つの大きな問題は、顔の色と法線を保存する方法です。各顔の三角形は頂点を共有する必要があり、共有頂点はその顔の色と法線を保存する必要があります。しかし、私は各顔が適切な色と正常を持つために十分な頂点を持っているとは思わない。私はこれを解決するエレガントな方法を考えることができません。

+0

なぜこれを行う必要がありますか? – DMan

+0

ゲームのためです。私はこのように見える敵を欲しい。 – RichardNewton

+0

あなたは正しい質問をしていますか?最後に、あなたはすでにあなたがそれをやったことを話し、次に別の質問をしました。 – Arne

答えて

0

顔の色と法線の保存については、私はあなたが異なる顔のために同じ位置に頂点を複製する必要があることを受け入れなければならないと思います。 2つの頂点がいくつかの属性を共有するが、他の頂点で異なる場合は、共有する属性の1つがその位置であっても、本質的に異なります。

したがって、必要に応じて重複した頂点を持ついくつかのVBOを構築する必要があります。これを設計時のステップとして実行し、実行時に作業を節約するために結果を便利な形式に保存することができます。

編集:これは、すべてのキューブのすべての面の各コーナーごとに別々の頂点を持つ必要があるというわけではありません。実際には、あなたが望むものをレンダリングする最も簡単な方法(ブロックが一緒になっている間)を合理的に簡単に実装するには、おそらく色のテクスチャを使用して2つの三角形として前面と背面をレンダリングします。GL_MAG_FILTER, GL_NEARESTサンプリングとテクスチャ座標の注意深い整列ピクセルシェーダを使用して透明テクセルをクリップします。

次に、面から見えるようにするために(実行時ではなく)もう少し作業を行う必要があります。各面をジオメトリとして作成します(ジオメトリはすべて1つの静的VBO例えば、各キューブの表示リストは依然として有用であるが、推奨されていないものを呼び出すのと比較して、ドローコール数とジオメトリコストの両方を削減する。再度注意して、これが正面と背面の目に見えない部分と正確に結合することを保証することができます。

敵を吹き飛ばして、構成キューブを別々にしたい場合は、すべての単一キューブを表示するより高価なバージョンに切り替えることができます。

+0

ヒントをお願いします。私はこれを難しい方法で学びました...ところで、私はiPhone用にOpenGL ESを使ってこれを書いています。頂点の数が多すぎるというガイドラインはありますか?これは非常に一般的な質問ですが、ゲームの敵が32x32ピクセルのビットマップに基づいていて、各ピクセルをキューブとして表すために8つの頂点を使用する場合は、8192の頂点と数千の三角形です。それは私のように聞こえる。私はこれが非常に非効率的に聞こえるかどうか疑問に思います。 – RichardNewton

+0

私はiPhoneのハードウェアについて本当に知っていませんが、それは私に多くのvertsのように聞こえるわけではありません。 – PeterT

+0

また、キューブを分割したくないのに、リンク先の画像と同様にレンダリングするだけであれば、それよりもはるかに少ない頂点しか必要としません。隠れている内部の面を避けることができます。また、同じ面に表示される頂点を共有することもできます(特に、頂点属性で指定する必要がある一意の情報が少ないような、色のテクスチャを使用する場合)。 – PeterT

2

透明な部分にアルファとGL_ALPHA_TESTを使用して、前面を単一のテクスチャマップGL_QUADとしてレンダリングすると、最速になります。その後、境界線、つまり正面が正面でない四角形を1つ以上のGL_QUAD_STRIPとして作成します。

スプライトを一連の実際の立方体として描画することが決定されている場合(スプライトを別の立方体に吹き飛ばしたい場合や小さな立方体の面に非常に細かいテクスチャがある場合など)は、 1つのキューブのリストとその表示リストを繰り返し呼び出します。

+0

クワッドは廃止予定です。もう使用しないでください。ハードウェアはトリスのみレンダリングします。 –

+0

ヒントをありがとう。私は最近、このアプローチを実際に試しましたが、問題はテクスチャマッピングされたクワッドと境界クワッドストリップが合致するシーム(つまり小さなギャップ)が見えることでした。私はこれに対する解決策を見つけることができませんでした。私は多くの小さな三角形を使用して前面と背面をレンダリングすることで作業していますが、これはレンダリングのパワーをより多く使います。 – RichardNewton

+0

@リチャード縫い目が大きい場合は、数式を再確認してください。それらが小さければ(1ピクセル以下)、境界キューブの前面を描画し、部分的に透明なフロントクワッドに使用されているビットマップの境界線の周りのいくつかのピクセルを取り除くことで回避できます。フロントクワッドをキューブの前に置いてください。インテリアキューブである立方体の前面の大部分を引き出します。 –

0

「ボクセル(voxel)」を検索すると、興味深い情報が見つかるかもしれません。 http://en.wikipedia.org/wiki/Voxel

たぶん、あなたは、マップのキューブの細分化に基づいており、オープンソースのゲームエンジンキューブ/ザウアーブラーテンのソースコードに見てみると、素敵なゲーム内のエディタが付属していたいと思います: http://sauerbraten.org/