SDL2 AntiAliasing

Как включить сглаживание в SDL2 при использовании SDL_RenderCopyEx?

Я нахожу несколько статей, которые предлагают использовать:

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

а также

glEnable(GL_MULTISAMPLE);

Но это не дает никакого эффекта. Есть идеи?

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

возвращается

buf = -858993460, образцы = -858993460.

РЕДАКТИРОВАТЬ: КОД:

   #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[] )
{
// Inicjacja SDL'a
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);

// Tworzenie okna
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;
}

Не беспокойтесь о стиле или ошибках, связанных с освобождением памяти и т. Д. Это был быстрый набросок для проверки возможности SDL’a

3

Решение

Если вы ищете ответ, который не требует использования opengl, то это может быть полезно:

SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" );

https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY

7

Другие решения

Насколько я могу судить, попробовав, значения не устанавливаются до тех пор, пока не будет создан контекст, поэтому, если вы запустите SDL_GL_GetAttribute строк перед созданием окна вы получите неинициализированные значения обратно, как вы делаете в настоящее время.

Таким образом, чтобы получить правильные значения, используйте SDL_GL_GetAttribute вызов после создания контекста, и он должен работать нормально.

Дайте мне знать, как вы поживаете, и если вам нужна дополнительная помощь / информация, я помогу, как смогу.

Приложение:

Похоже, вы создали окно перед настройкой его свойств, я вставил модифицированный код, который должен работать нормально (извините, я не могу проверить его, пока не получу доступ к своему домашнему ПК).

Переставленный код:

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

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

#include <gl/include/glew.h>

using namespace std;

void myInit()
{
// SDL Init
SDL_Init(SDL_INIT_EVERYTHING);

// Settings
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);

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

SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

glEnable(GL_MULTISAMPLE);
}

int main( int argc, char * args[] )
{
myInit();

// Window Create
SDL_Window *win = nullptr;
win = SDL_CreateWindow("abc", 100, 100, 800, 600, SDL_WINDOW_SHOWN);

if(win == nullptr) return 1;

// Create Renderer
SDL_Renderer *ren = nullptr;
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

if (ren == nullptr) 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 texture
SDL_Texture *tex = nullptr;
tex = IMG_LoadTexture(ren, "circle.png");

SDL_SetTextureAlphaMod(tex, 100);
SDL_SetTextureColorMod(tex, 255,0,0);

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 = 220;

c.x = c.y = 110;

// Event Queue
SDL_Event e;
bool quit = false;
int angle = 45.0*M_PI/180;

while(!quit)
{
while (SDL_PollEvent(&e)){
//If user closes the window
if (e.type == SDL_QUIT)
quit = true;
}

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

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

// Quit
SDL_Quit();

return 0;
}
0

По вопросам рекламы [email protected]