SDL2 OpengGL 抗锯齿无效
SDL2 OpengGL Anti-aliasing has no effect
我想用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 通道。但是控制台输出是 "buffer = 0, samples = 4".
关于如何在 SDL2(有或没有 OpenGL)中激活(修复)AA 的任何想法。
下一张截图展示了我所拥有的和我想要的。 Pinta软件绘制的底图
您正在尝试使用 OpenGL window 提示来消除锯齿,但这仅在您使用 OpenGL 上下文创建 window 时有效,这将禁用所有 SDL 渲染。
您用来绘制实心椭圆的 SDL2/SDL2_gfxPrimitives.h
库具有多个抗锯齿功能,但不适用于实心椭圆,解决方法是绘制一个未填充的抗锯齿椭圆,并使用实心椭圆每次绘制消除锯齿的椭圆时都会在内部发生 eclipse。
void aafilledEllipseRGBA(...) {
aaellipseRGBA(...);
filledEllipseRGBA(...);
}
或者编写自己的抗锯齿填充椭圆渲染代码。您可以通过查看他们的代码 here.
来基于您正在使用的开源库的代码
我想用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 通道。但是控制台输出是 "buffer = 0, samples = 4".
关于如何在 SDL2(有或没有 OpenGL)中激活(修复)AA 的任何想法。
下一张截图展示了我所拥有的和我想要的。 Pinta软件绘制的底图
您正在尝试使用 OpenGL window 提示来消除锯齿,但这仅在您使用 OpenGL 上下文创建 window 时有效,这将禁用所有 SDL 渲染。
您用来绘制实心椭圆的 SDL2/SDL2_gfxPrimitives.h
库具有多个抗锯齿功能,但不适用于实心椭圆,解决方法是绘制一个未填充的抗锯齿椭圆,并使用实心椭圆每次绘制消除锯齿的椭圆时都会在内部发生 eclipse。
void aafilledEllipseRGBA(...) {
aaellipseRGBA(...);
filledEllipseRGBA(...);
}
或者编写自己的抗锯齿填充椭圆渲染代码。您可以通过查看他们的代码 here.
来基于您正在使用的开源库的代码