Как рисовать сглаженные линии в 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, что можно сделать с помощью мультисэмплинга. Вы из кода видно, что я пробовал использовать некоторые методы, специфичные для этой техники, но я не смог полностью понять их использование и получил плохие результаты:
Если кто-то может объяснить мне, как получить сглаженные линии и сделать контуры более гладкими, я буду очень благодарен.
2 ответов
С помощью маркера GL_MULTISAMPLE можно включить или отключить Мультисамплинг, и по умолчанию он включен.
чтобы узнать, поддерживается ли мультисамплинг текущей активной поверхностью EGL, запросите значение буферов GL_SAMPLE_: здесь 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
};
I установите EGL_SAMPLE_BUFFERS в 1, чтобы иметь многоразрядный буфер и EGL_SAMPLES в 4, таким образом, имея 4 образца на пиксель (FSAA x4).
чтобы иметь возможность делать многопоточность, вам нужен многопоточный фреймбуффер. В большинстве реализаций OpenGL-ES это делается путем создания объекта буфера кадров с несколькими сопоставлениями, рендеринга, а затем копирования его содержимого в фреймбуфер экрана.