6

頂点配列として保存したいくつかの輪郭を描画しようとしています。

 typedef struct
{
    float* vertices;
    int nrPoints;
}VertexCurve;

list<VertexCurve> CurveList;

私はopengles2.0の本からいくつかのサンプルを使用しています:http://opengles-book.com/

描画方法は次のようになります。

    void Draw ( ESContext *esContext )
{
   UserData *userData = (UserData*)esContext->userData;
   
   // Set the viewport
   glViewport ( 0, 0, esContext->width, esContext->height );
   
   // Clear the color buffer
   glClear ( GL_COLOR_BUFFER_BIT );

   // Use the program object
   glUseProgram ( userData->programObject );

   //glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
   //glEnable(GL_SAMPLE_COVERAGE);
   //glSampleCoverage(0.5, GL_FALSE);
   glEnableVertexAttribArray ( 0 );

   //glLineWidth(1);

   for (list<VertexCurve>::iterator it = CurveList.begin();
            it != CurveList.end(); it++)
   {
       // Load the vertex data
       glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, (*it).vertices );

       glDrawArrays ( GL_LINE_LOOP, 0, (*it).nrPoints );
   }

   eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
}

また、図面の結果は次のとおりです。

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

私が必要としているのは、マルチサンプリングで実行できるOpenGL ES 2で、より滑らかな線(アンチエイリアス処理)と私が読んだものを用意することです。この手法に固有のいくつかの方法を使用してみたが、それらの使用法を完全に理解できず、悪い結果が得られたことがコードからわかります。

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

アンチエイリアス処理された線を取得して輪郭を滑らかにする方法を誰かに説明していただければ、非常にありがたいです。

4

2 に答える 2

9

マルチサンプリングは、トークン GL_MULTISAMPLE を使用して有効または無効にすることができ、デフォルトで有効になっています。

マルチサンプリングが現在アクティブな EGL サーフェスでサポートされているかどうかを確認するには、GL_SAMPLE_BUFFERS の値を照会します。ここで、1 はサポートされていることを意味し、0 はサポートされていないことを示します。GL_SAMPLES は、ピクセルごとに保存されているサンプル数を示します。

したがって、私がしなければならなかったのは、これらの 2 つの属性をコンテキスト属性リストに追加することだけでした。

    EGLint attribList[] =
   {
       EGL_RED_SIZE,       8,
       EGL_GREEN_SIZE,     8,
       EGL_BLUE_SIZE,      8,
       EGL_ALPHA_SIZE,     (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE,
       EGL_DEPTH_SIZE,     (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE,
       EGL_STENCIL_SIZE,   (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE,
       EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0,
       EGL_SAMPLES, 4,
       EGL_NONE
   };

EGL_SAMPLE_BUFFERS を 1 に設定してマルチサンプル バッファーを設定し、EGL_SAMPLES を 4 に設定して、ピクセルあたり 4 つのサンプル (FSAA x4) を設定します。

于 2011-12-07T10:06:11.897 に答える
5

マルチサンプリングを行うには、マルチサンプル フレームバッファが必要です。ほとんどの OpenGL-ES 実装では、これは、マルチサンプリング フレーム バッファ オブジェクトを作成し、それにレンダリングしてから、その内容を画面フレーム バッファにコピーすることによって行われます。

于 2011-12-01T09:15:31.893 に答える