6

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

 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 中拥有更平滑的线条(抗锯齿),并且可以通过多重采样来完成。您可以从代码中看到我尝试使用特定于该技术的一些方法,但我无法完全理解它们的用法并得到了不好的结果:

在此处输入图像描述

如果有人可以向我解释如何获得抗锯齿线条并使轮廓更平滑,我将非常感激。

4

2 回答 2

9

可以使用令牌 GL_MULTISAMPLE 启用或禁用多重采样,默认情况下它是启用的。

为了查明当前激活的 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)。

于 2011-12-07T10:06:11.897 回答
5

为了能够进行多重采样,您需要一个多重采样帧缓冲区。在大多数 OpenGL-ES 实现中,这是通过创建一个多重采样的帧缓冲区对象,渲染到该对象,然后将其内容复制到屏幕帧缓冲区来完成的。

于 2011-12-01T09:15:31.893 回答