Warsztat » Forum

[Programowanie grafiki] [OpenGL] problem z antialiasingiem

Nov 13, 2009 | dawidb |
5 wypowiedzi na 1 stronach:
1
dawidb
Nov 13, 2009

[OpenGL] problem z antialiasingiem

Witam,
nie moge zmusic do dzialania antialiasingu, bede wdieczny za jakakolwiek pomoc. Probuje uzyc zwyklego GL_POLYGON_SMOOTH, jednak bez zadnych efektow. Oto jak to robie:
Kod: 

BOOL DisplayScene()
{
   glBegin(GL_TRIANGLES);
        glVertex3f( 0.0, 0.0, -1.0 );
        glVertex3f( 1.0, 0.0, -1.0 );
        glVertex3f( 0.5, 1.0, -1.0 );
   glEnd();
}
//Gdzies indziej w kodzie. Zalaczam/wylaczam antialiasing
switch(message)
{
case WM_KEYDOWN:
   if(wParam == 'O') {
   glEnable( GL_BLEND );
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glEnable(GL_POLYGON_SMOOTH);
   glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
   }
   if(wParam == 'F') {
        glDisable( GL_BLEND );
   glDisable(GL_POLYGON_SMOOTH);
   }
}

Uzywam Visty, oto jak ustawilem strukture PIXELFORMATDESCRIPTOR:
Kod: 

static PIXEsizeof(PIXELFORMATDESCRIPTOR) pfd = {
sizeof(PIXELFORMATDESCRIPTOR), //WORD nSize
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //DWORD dwFlags;
PFD_TYPE_RGBA, //BYTE iPixelType;
32, //BYTE cColorBits;
0 //BYTE cRedBits;
0, //BYTE cRedShift;
0, //BYTE cGreenBits;
0, //BYTE cGreenShift;
0, //BYTE cBlueBits;
0, //BYTE cBlueShift;
16, //BYTE cAlphaBits;
0, //BYTE cAlphaShift;
0, //BYTE cAccumBits;
0, //BYTE cAccumRedBits;
0, //BYTE cAccumGreenBits;
0, //BYTE cAccumBlueBits;
0, //BYTE cAccumAlphaBits;
16, //BYTE cDepthBits;
0, //BYTE cStencilBits;
0, //BYTE cAuxBuffers;
PFD_MAIN_PLANE, //BYTE iLayerType;
0, //BYTE bReserved;
0, //DWORD dwLayerMask;
0, //DWORD dwVisibleMask;
0 //DWORD dwDamageMask;
}

Nadmienie tylko ze GL_LINE_SMOOTH i GL_POINT_SMOOTH dziala dobrze.
Kos
Nov 14, 2009

Odp: [OpenGL] problem z antialiasingiem

Nadmienię tylko, że nie udało mi się nigdy uzyskać dobrego antyaliasingu z POLYGON_SMOOTH - raz, że musisz mieć blending cały czas włączony, a dwa, że nie udało mi się nigdy tego zrobić tak żeby na łączeniach polygonów nie było widać artefaktów. Ale może za słabo próbowałem :)

Fajną opcją jest MSAA - sprowadza się w OGLu do glEnable(GL_MULTISAMPLE) i przestawieniu paru flag tworząc framebuffer (szukaj czegoś w stylu MULTISAMPLE_BUFFERS na 1 i MULTISAMPLE_SAMPLES na 2, 4, 8...). Możesz potrzebować nowszego OpenGL-a niż domyślny w windowsach, więc w razie potrzeby od razu nadmienię że szybko załatwia się to za pomocą GLew.
.c41x
Nov 16, 2009

Odp: [OpenGL] problem z antialiasingiem

sprawdz tak:
Kod: 

BOOL DisplayScene()
{
   glClearColor(0.f,0.f,0.f,0.f); // czarny
   glClear(...);//
..
   glBegin(GL_TRIANGLES);
        glVertex3f( 0.0, 0.0, -1.0 );
        glVertex3f( 1.0, 0.0, -1.0 );
        glVertex3f( 0.5, 1.0, -1.0 );
   glEnd();
}
//Gdzies indziej w kodzie. Zalaczam/wylaczam antialiasing
switch(message)
{
case WM_KEYDOWN:
   if(wParam == 'O') {
   glEnable( GL_BLEND );
   glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); // !
        glDisable(GL_DEPTH_TEST); // !
   glEnable(GL_POLYGON_SMOOTH);
   glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
   }
   if(wParam == 'F') {
        glDisable( GL_BLEND );
   glDisable(GL_POLYGON_SMOOTH);
   }
}


poza tym jak Kos pisze - lepiej uzyc FSAA.
dawidb
Nov 18, 2009

Odp: [OpenGL] problem z antialiasingiem

Cytat:

sprawdz tak:
    ....

Niesstety wciaz bez efektow, ale dzieki ; p

Podejrzewam (ale zupelnie nie znam sie na winapi), ze problem tkwi w dodaniu wartosci alfa do 'opisu' pixela (chodzi mi o strukture PIXELFORMATDESCRIPTOR). Wpisalem tam 16 (cAlphaBits), jednak oto co czytam w dokumentacji ( http://msdn.microsoft.com/en-us/library/dd368826%28VS.85%29.aspx ) :
Cytat:
cAlphaBits

    Specifies the number of alpha bitplanes in each RGBA color buffer. Alpha bitplanes are not supported.

Tak wiec sam juz nie wiem. Moge sobie wpisac, ale i tak nie jest to suportowane (?).

Cytat:
Nadmienię tylko, że nie udało mi się nigdy uzyskać dobrego antyaliasingu z POLYGON_SMOOTH

To prawda, panuje powszechna opinia , ze taki antialiasing nie jest najlepszy, jednak chcialem chociaz odpalic przykladowy program. Tak czy owak dam sobie chyba z tym spokoj i zajme sie tym multisamplingiem.

dzieki za pomoc all ; p
.c41x
Nov 27, 2009

Odp: [OpenGL] problem z antialiasingiem

Jak chcesz sobie tylko sprawdzic jak to dziala to tu jest przykladowy kod programu: http://fly.cc.fer.hr/~unreal/theredbook/chapter07.html  Przyklad 7-5.
Strony:
1