Как рисовать сглаженные линии в OpenGL ES 2.0?

Я пытаюсь нарисовать контуры, которые я сохранил в виде массивов вершин:

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

list<VertexCurve> CurveList;

Я использую несколько примеров из книги opengl es 2.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, что можно сделать с помощью мультисэмплинга. Из кода видно, что я пробовал использовать некоторые методы, характерные для этой техники, но я не смог полностью понять их использование и получил плохие результаты:

введите описание изображения здесь

Если кто-нибудь объяснит мне, как получить сглаженные линии и сделать контуры более плавными, я буду очень признателен.


person Adrian    schedule 01.12.2011    source источник


Ответы (2)


Мультисэмплинг можно включить или отключить с помощью токена 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).

person Adrian    schedule 07.12.2011
comment
Вопрос касается Opengl ES, а не обычного Opengl. GL_MULTISAMPLE не поддерживается в Opengl ES. - person BigHeadCreations; 08.09.2020

Чтобы иметь возможность выполнять мультисэмплинг, вам нужен мультисэмплерный буфер кадра. В большинстве реализаций OpenGL-ES это делается путем создания мультидискретизированного объекта буфера кадра, рендеринга в него, а затем копирования его содержимого в экранный буфер кадра.

person datenwolf    schedule 01.12.2011
comment
Не могли бы вы немного подробнее рассказать о своем ответе? Я начал изучать OpenGL всего несколько дней назад. Документация по мультисэмплингу в OpenGL es 2.0 действительно скудна. Как мне создать этот буфер кадра и как его использовать? Если у вас есть ссылки на некоторые примеры, это тоже будет полезно. - person Adrian; 01.12.2011