Openglでオブジェクトの周りに輪郭を描く


8

3D空間で2Dオブジェクトの周りに輪郭を描く必要があります。オブジェクトの周りに線を引いてみましたが(ギャップを埋めるためのポイント)、線の幅のため、その一部(〜50%)がオブジェクトを覆っていました。この問題を解消するためにステンシルバッファーを使用しようとしましたが、次のようになりました(輪郭は緑です)。

http://goo.gl/OI5uc(評判のため、画像を投稿できません)

線の一部がオブジェクトの背後にあり、一部が上にあることが(矢印が指しているところ)わかります。これはカメラを動かすと変化しますが、常にそれを覆っている部分があります。これが、オブジェクトの描画に使用するコードです。

    glColorMask(1,1,1,1);
    std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
    int countStencilBit=1;
    while(objIter!=objEnd)
    {
        glColorMask(1,1,1,1);
        glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
        glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
        (*objIter)->DrawYourVertices();

        glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
        glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
        (*objIter)->DrawYourBorder();

        ++objIter;
        ++countStencilBit;
    }

私はステンシルバッファーのさまざまな設定を試しましたが、常にそのようなsthを取得していました。ここに質問があります: 1.ステンシルバッファを間違って設定していますか?

2.そのようなオブジェクトに輪郭を作成する他の簡単な方法はありますか?

前もって感謝します。

編集:

1.オブジェクトの法線がありません。

2.物体は凹面である可能性があります。

3.シェーダーを使用できません(以下の理由を参照してください)。


オブジェクトの周囲に輪郭が描かれている「トゥーン」またはセルシェーディングを確認できます。lighthouse3d.com/tutorials/glsl-tutorial/?toon
ジョナサンコネル2011年

場合は...私はこのプロジェクトでシェーダを使用することはできません
therealszaka

@Maciekpシェーダーを使用できないのはなぜですか?これは宿題ですか?
ジョナサンコネル

このアプリは多くのコンピューターで動作する必要があり、常に最新のコンピューター(つまり1ポイント)である必要はありません。それはゲームではありません。これは、グラフィックスをその一部として含むアプリです+ Mac、Win、Linuxで動作する必要があります。
therealszaka

1
GameDev向けではない場合は、SOに投稿されているはずです。質問に回答してもらいたい場合は、できるだけ多くの情報を提供する必要があります。
ジョナサンコネル

回答:


12
  • ハイライトされたオブジェクトを除いて、シーン全体を描きます。
  • ハイライトしたいオブジェクトを、純粋な色で、後ろから前に並べ替え、小さなスケール(1.05f-1.1f)を適用して描画します。
  • 再び、最後のオブジェクトを後ろから前に描きます。

見栄えを良くするには、コンターパスを別のレンダーターゲットに描画し、小さなぼかしを適用してから、適切なZ値を使用してこのテクスチャを最終的なシーンにブレンドします。


これは素晴らしいバルバトリックです!
FxIII

これは、gfxパイプラインがまだ修正されていたときに彼らがアウトラインに使用していた古いトリックです。
ジョナサンコネル

2
それは凹面のオブジェクトでは機能しません
therealszaka

@Maciekpあなたの質問は、3D空間の2Dオブジェクト(平面)に関するものでした。2つの軸!=に沿って、顔の方向にスケールします。
ジョナサンコネル

それはする必要がありますが、法線を反転した場合に輪郭を描きながら(あなたが顔カリングを有効にする必要があります)凹面のオブジェクトのために働きます。
r2d2rigo

0

私はそのようにします:

  • オブジェクトを前後(カメラからの距離)順に並べ替えます

  • 無効にしてオブジェクトの境界線を(線と点として)描画します GL_DEPTH_TEST

  • 有効にしてオブジェクトを描画 GL_DEPTH_TEST

  • すべてのオブジェクトに対して最後の2つのステップを実行する

私はそのようにしようとしますが、誰かがこの問題のより良い解決策のアイデアを持っている場合(心のオブジェクトを隠してください、お願いします)-遠慮なく私たちと共有してください。

PS。私はソリューションを変更するOpenGLの状態に完全に満足していないため、多くの場合、害を及ぼす可能性があります。しかし、ステンシルバッファの設定を手伝ってくれる人がいない場合は、それが唯一の方法だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.