我正在尝试绘制一些我存储为顶点数组的轮廓:
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中读到的可以通过多重采样完成的线条。您可以从代码中看到我尝试使用某种特定于此技术的方法,但我无法完全理解它们的用法并得到不好的结果:
如果有人能向我解释如何获得消除锯齿的线条并使轮廓更加平滑,我将非常感激。
答案 0 :(得分:10)
可以使用令牌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)。
答案 1 :(得分:4)
为了能够进行多重采样,您需要一个多重采样帧缓冲区。在大多数OpenGL-ES实现中,这是通过创建一个多重采样的帧缓冲对象,渲染到它,然后将其内容复制到屏幕帧缓冲区来完成的。