web-dev-qa-db-ja.com

アンチエイリアスを使用してOpenGLで滑らかな線を描く方法は?

OpenGLで滑らかな線を引く必要があります。これが私が行ったことです。

glEnable( GL_LINE_SMOOTH );
glEnable( GL_POLYGON_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
glBegin( GL_LINE_STRIP );
    for( UINT uiPoint = 0; uiPoint < iNumPoints; ++uiPoint )
    {
        const Coord &Node = vecPoints[uiPoint];
        glVertex3f( Node.x, Node.y, Node.z );
    }
glEnd();

他に何ができますか?

13
q0987

代わりに、画面指向の薄いポリゴンを生成し、線までの距離に応じてフラグメントのアルファを設定できます。

例:

   a (0,1)                                  b (0,1)
    +--------------------------------------+
  A |                                      | B
----+--------------------------------------+----
    |                                      |  
    +--------------------------------------+
   d (0,0)                                  c (0,0)

セグメント[AB]を描画するとします。

  • 代わりにポリゴンabcdを描画します
  • UVをマップします((0,0)、(0,1))
  • 中央のみが白である8x1の白黒テクスチャをバインドします
  • テクスチャからgl_FragColor.aを設定するフラグメントシェーダーでレンダリングします

(多かれ少なかれShaderX5で使用される技術)

ただし、これはMSAAを使用できない場合にのみ行ってください。

12
Calvin1602

また、ラインスムージングを機能させるには、ブレンディングをオンにする必要があります。試してください:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

そして線を引きます。線幅を非整数幅に設定すると役立つ場合があります。

他の人が述べているように、これはポリゴンエッジを滑らかにしませんが、アンチエイリアスされた線を作成します。

22
Gretchen

別の回答として述べたように、アンチエイリアスを有効にすると役立ちます。これを有効にする方法はコンテキストの作成によって異なりますが、この情報がGLFWユーザーに役立つことを願っています。

GLFW 2を使用する場合:glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);

GLFW 3を使用する場合:glfwWindowHint(GLFW_SAMPLES, 4);

...または任意の数のアンチエイリアスサンプル。上記のヒントは、GLFWウィンドウを開く前に設定する必要があります。

5
Riot

GL_POLYGON_SMOOTH自体は役に立ちません。 OpenGLコンテキストが作成されるときに、アンチエイリアスを強制する必要があります。 OpenGLウィンドウを作成するために何を使用しますか?パラメータ間でアンチエイリアスをサポートしているかどうかを確認してください。または、NvidiaまたはATIツールを使用してすべてのOpenGLプログラムのアンチエイリアスを強制することもできます...それはすべてセットアップによって異なります。

5
alxx

GL_LINE_SMOOTHまたはGL_POLYGON_SMOOTHが何かを行うという保証はありません。

それらはコア機能のように見えますが、私の経験では、多くのハードウェアがこれらを実装していません。一貫して実装していないハードウェアは、実装するとパフォーマンスが大幅に低下する可能性があります。 OpenGL仕様ドキュメントを見ると、これらはライブラリ全体の優れたリファレンスを提供しますが、仕様の一部ではないため、ここにはこれらの記述はありません。これは、glEnableの仕様を確認することである程度確認できます:khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml

1
jheriko