c++openglsdlantialiasing

SDL2 AntiAliasing


How to turn on antialiasing in SDL2, when using SDL_RenderCopyEx?

I find some articles that suggest to use:

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

and

glEnable(GL_MULTISAMPLE);

But this makes no effect. Any ideas?

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

returns

buf = -858993460, samples = -858993460.

EDIT: CODE:

#include <windows.h>
#include <iostream>

#include <SDL2/include/SDL.h>
#include <SDL2/include/SDL_image.h>

using namespace std;


int main( int argc, char * args[] )
{
    // SDL Init
    SDL_Init(SDL_INIT_EVERYTHING);
 
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8);
    
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); 

    // Create window
    SDL_Window *win = nullptr;
    win = SDL_CreateWindow("abc", 100, 100, 800, 600, SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    
    if (win == nullptr) 
    {
        std::cout << SDL_GetError() << std::endl;
        system("pause");
        return 1;
    }
    

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

    // Create Renderer
    SDL_Renderer *ren = nullptr;
    ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    
    if (ren == nullptr)
    {
        std::cout << SDL_GetError() << std::endl;
        return 1;
    }

    // Create texture
    SDL_Texture *tex = nullptr;
    tex = IMG_LoadTexture(ren, "circle.png");

    SDL_SetTextureAlphaMod(tex, 100);
    
    SDL_Rect s,d;
    SDL_Point c;
    s.x = s.y = 0;
    s.w = s.h = 110;

    d.x = 320;
    d.y = 240;
    d.w = d.h = 110;

    c.x = c.y = 55;

    // Event Queue
    SDL_Event e;
    bool quit = false;
    int angle = 0;

    while(!quit)
    {
        while (SDL_PollEvent(&e)){
            //If user closes he window
            if (e.type == SDL_KEYDOWN)
                quit = true;
        }
        angle += 2;

        float a = (angle/255.0)/M_PI*180.0;

        // Render
        SDL_RenderClear(ren);
        SDL_RenderCopyEx(ren, tex, &s, &d, a, &c, SDL_FLIP_NONE);
        SDL_RenderPresent(ren);


    }

    // Release
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);

    // Quit
    SDL_Quit();

    return 0;
}

Do not worry about style or errors related to memory deallocation, etc. It was a quick sketch to test the possibility SDL'a


Solution

  • If you're looking for an answer that doesn't require opengl use, then this may be of use:

    SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" );
    

    https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY