SDL2 OpenGL 抗锯齿没有效果

Posted

技术标签:

【中文标题】SDL2 OpenGL 抗锯齿没有效果【英文标题】:SDL2 OpengGL Anti-aliasing has no effect 【发布时间】:2015-03-30 21:40:38 【问题描述】:

我想用 SDL2 绘制平滑填充椭圆。 我有以下代码

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#include <GL/gl.h>

void init()

   SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
   SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
   glEnable(GL_MULTISAMPLE);


int main()

   SDL_Init(SDL_INIT_EVERYTHING);
   init();

SDL_Window* window = SDL_CreateWindow("Anti-aliasing test",
                                      SDL_WINDOWPOS_CENTERED,
                                      SDL_WINDOWPOS_CENTERED,
                                      100, 100,
                                      SDL_WINDOW_RESIZABLE);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

int Buffers, Samples;
SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &Buffers );
SDL_GL_GetAttribute( SDL_GL_MULTISAMPLESAMPLES, &Samples );
std::cout << "buf = " << Buffers << ", samples = " << Samples;
std::cout.flush();


SDL_Event e;
int x, y;
while(true)

    SDL_WaitEvent(&e);
    if (e.type == SDL_QUIT)
        break;

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderClear(renderer);
    SDL_GetWindowSize(window, &x, &y);
    filledEllipseRGBA(renderer, x / 2, y / 2, 50, 50,  255, 0, 0, 255);
    SDL_RenderPresent(renderer);


我希望使用抗锯齿进行绘制,但实际上我对 OpenGL 没有任何影响。

我们可以看到我的圈子没有使用 Alpha 通道,这是 AA 所必需的。但是控制台输出是“buffer = 0, samples = 4”。

关于如何在 SDL2(有或没有 OpenGL)中激活(修复)AA 的任何想法。

下一个屏幕截图展示了我拥有什么以及我想要什么。用 Pinta 软件绘制的底部图片。

【问题讨论】:

我找到了一些“解决方案”。在调用 fillEllipseRGBA 之前添加具有相同参数的 aaellipseRGBA 使圆形非常好。但我认为这不是好方法。 如果您得到 0 的样本缓冲区数量,这是您应该期待的行为。多重采样至少需要 1 才能执行任何操作。 【参考方案1】:

您正在尝试使用 OpenGL 窗口提示进行抗锯齿,但这仅在您创建具有 OpenGL 上下文的窗口时有效,这将禁用所有 SDL 渲染。

您用来绘制填充椭圆的SDL2/SDL2_gfxPrimitives.h 库具有多个抗锯齿功能,但不适用于填充日食,解决方法可能是每次绘制一个未填充的抗锯齿椭圆,里面有一个填充的日食绘制一个消除锯齿的椭圆。

void aafilledEllipseRGBA(...) 
    aaellipseRGBA(...);
    filledEllipseRGBA(...);

或编写您自己的抗锯齿填充椭圆渲染代码。您可以通过查看他们的代码here,以您正在使用的开源库的代码为基础。

【讨论】:

以上是关于SDL2 OpenGL 抗锯齿没有效果的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL核心技术之抗锯齿

◮OpenGL-抗锯齿

OpenGL 抗锯齿不起作用

OpenGL 抗锯齿与 glAccum 和 glRasterPos

在 OpenGL ES 2.0 中渲染到纹理时的抗锯齿

在qt的QOpenGLWidget开启opengl的抗锯齿