2015-03-30 155 views
0

我想用SDL2繪製平滑的填充橢圓。 我有以下代碼SDL2 OpengGL消除鋸齒沒有效果

#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是必需的。但是控制檯輸出是「緩衝區= 0,樣本= 4」。

關於如何在SDL2中激活(修復)AA(帶或不帶OpenGL)的任何想法。

下一個截圖顯示我有什麼,我想要什麼。在Pinta軟件中繪製底圖。

enter image description here

+0

我找到了一些「解決方案」。在調用filledEllipseRGBA之前,使用相同的參數添加aaellipseRGBA使得圓形非常好。但我認爲這不是好的方法。 – Dmitry 2015-03-30 22:13:46

+0

如果您獲得了** 0 **返回樣本緩衝區的數量,這是您應該期望的行爲。這需要至少** 1 **爲多重採樣做任何事情。 – 2015-03-31 08:17:11

回答

1

您正在嘗試使用OpenGL窗口提示對抗鋸齒的,但是當你創建一個窗口,用OpenGL上下文,這將禁用所有SDL renderering這僅適用。

SDL2/SDL2_gfxPrimitives.h用於繪製填充橢圓的庫有幾個抗鋸齒功能,但不是用於填充的蝕刻,可以在每次繪製時繪製未填充的抗鋸齒橢圓和填充的蝕刻一個消除鋸齒的橢圓。

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

或寫你自己的抗鋸齒填充橢圓渲染代碼。你可以通過在代碼here上查看你使用的開源庫的代碼。