8

私のAndroidアプリでは、3Dオブジェクトを表示する必要があります(問題ありません)が、前端は塗りつぶされ、後端は点線である必要があります。写真のようなものが必要です。OpenGL ES 1または2を使用してそれを達成するにはどうすればよいですか?

私はTimのアイデアを試しました(深度バッファーを使用)。それは機能しますが、写真のように、点線(紫)の線が実線(赤)の線と重なっているようなアーティファクトがいくつかあります。

ここに画像の説明を入力してください ここに画像の説明を入力してください

これは、赤い線(GL_LEQUAL)の後に点線(紫色(GL_GREATER))が描画されるために発生します。それを防ぐ方法はありますか?

皆さん、助けてくれてありがとう。今では見栄えがします! ここに画像の説明を入力してください

4

1 に答える 1

2

これが私がすることの大まかな概要です。オブジェクト自体に1つのメッシュが必要であり、描画する「エッジライン」にGL_LINESの別のメッシュが必要です。

  1. ソリッドメッシュをデプスバッファに描画します。
  2. 実線が得られるように、標準のシェーダーを使用して「エッジメッシュ」を描画しますが、深度テストをGL_LEQUALに設定します(深度値よりも近いオブジェクトのみを描画します。
  3. GL_GREATERの深度テストを使用して、エッジメッシュをもう一度描画します。このパスでは、点刻シェーダーを使用して点線効果を取得します(以下でさらに説明します)。

これは、シーン内の他のオブジェクトによっては問題が発生する可能性があります。立方体が他のオブジェクトによって隠されている場合に点線が描画される可能性がありますが、それは問題ではないか、メッシュをカリングすることができます。隠されています。

点刻シェーダーの場合、線の1つの頂点のtexcoordをゼロに設定し、線の別の端点を1に設定できます。次に、シェーダーで、 tencentによって提案されたものと同様のステップ関数を使用して、フラグメントを拒否し、点刻パターンを作成できます。

オブジェクトの背後にある線を自分で計算したい場合は、デプスバッファをいじることをスキップすることもできますが、立方体以外のものでは多くの作業が必要になる可能性があります。

OpenGLES2の代わりにOpenGLES1を使用する場合は、点刻シェーダーを点刻パターンの1Dテクスチャに置き換え、バックラインをそれでテクスチャリングします。ただし、OpenGLで線をテクスチャリングできるかどうかは100%確信が持てないため、これは機能しない可能性があります。

于 2012-10-20T18:32:31.703 に答える