opengl-es - 如何在OpenGL ES 2.0中绘制反锯齿线?

标签 opengl-es drawing opengl-es-2.0 antialiasing contour

我试图绘制一些已存储为顶点数组的轮廓:

 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中具有更平滑的线条(抗锯齿),以及从我的阅读中学到的内容,可以使用多重采样来完成。从代码中可以看到,我已经尝试使用特定于此技术的一些方法,但是我无法完全理解它们的用法,并得到了不好的结果:

如果有人可以向我解释如何获得消除锯齿的线条并使轮廓更平滑,我将不胜感激。

最佳答案

可以使用 token GL_MULTISAMPLE启用或禁用多重采样,默认情况下启用。

为了确定当前 Activity 的EGL曲面是否支持多重采样,请查询GL_SAMPLE_ BUFFERS的值:这里1表示支持,0表示不支持。 GL_SAMPLES然后告诉每个像素存储多少个样本。

所以我要做的就是在上下文属性列表中添加这两个属性:

    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)。

关于opengl-es - 如何在OpenGL ES 2.0中绘制反锯齿线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338696/

相关文章:

java - 使用 OpenGL 在 Android 中交叉淡入淡出场景

java - 随机生成形状和颜色并绘制到 Canvas 上

iphone - 未调用 glkView drawInRect

android - 在 OpenGL ES 中使用帧缓冲区的深度和模板渲染缓冲区附件

c - glDrawArrays 在 GLESv2 上抛出 GL_INVALID_VALUE

ios - 如何在 iOS 的 SceneKit 的 OpenGL SL 着色器中使用多个纹理?

ios - OpenGL ES 2.0 的学习曲线是否比 Metal 更陡峭?

Java OpenGL 画一颗星星

objective-c - 在缩放 UIScrollView subview 时保持恒定的线宽

ios - GLES2着色器的高精度输出