c++ - SDL2 OpengGL 抗锯齿无效

标签 c++ opengl sdl-2

我想用 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 的影响。

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

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

下一张截图展示了我拥有的和我想要的。 Pinta软件绘制的 basemap 。

enter image description here

最佳答案

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

用于绘制填充椭圆的 SDL2/SDL2_gfxPrimitives.h 库具有多个抗锯齿功能,但不适用于填充的 eclipse ,解决方法可能是绘制一个未填充的抗锯齿功能每次绘制抗锯齿椭圆时,锯齿椭圆内部都有一个填充的 eclipse 。

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

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

关于c++ - SDL2 OpengGL 抗锯齿无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356833/

相关文章:

c++ - 使用多词类型定义

c++ - Stroustrup 书中的前后条件

Java - 如何在 LWJGL 中使用顶点缓冲区对象?

opengl - 当我应用投影 OpenGL 时输出失真

c++ - sdl_ttf 文本换行

c++ - 使用 glTexImage2D 时为 "Frame not in module"

python - SDL2 像素图形流水线

c++ - 如何使用 LibSoX 混合两个 wav 文件

java - 使用 OpenGL 将网格移动到给定位置

c++ - 如何将 Winpcap 包含到 Qt creator?