쉽게말해
경계선의 계단현상을 앨리어싱이라고 하는데, 이를 보간해주는 걸 안티앨리어싱(Anti-Aliasing)이라고 합니다.
앨리어싱 : 계단현상, 색상간의 이질감
앨리어스의 주된 원인은 너무 뚜렷한 색상 차이입니다. 앨리어스를 제거하려면 보통 두 색상간의 경계면에 중간색을 삽입하는 경우가 대부분입니다.
다음 함수로 점, 선, 다각형에 안티앨리어싱을 적용할 수 있습니다.
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
블렌딩을 켜고 안티앨리어싱을 키면 OpenGL이 알아서 앨리어스를 제거합니다.
물론, 추가연산을 해야하기 때문에 시간은 좀 더 걸립니다.
속도와 품질은 항상 반비례관계에 있습니다.
속도가 빠르면 품질은 좋지않고,
품질이 좋으면 속도는 느려지게 되는건 어쩔 수 없겠죠?
둘 다 좋을 수는 없으므로, 개발자는 무엇을 더 우선시 할 것인지 정해야 합니다.
void glHint(GLenum target, GLenum mode);
target은 조정의 대상이고, mode는 옵션을 어떻게 조정할 것인가를 지정합니다.
조정가능한 옵션 목록, 이름보면 대충 촉이오죠?
GL_FOG_HINT
GL_GENERATE_MIPMAP_HINT
GL_LINE_SMOOTH_HINT
GL_PERSPECTIVE_CORRECTION_HINT
GL_POINT_SMOOTH_HINT
GL_POLYGON_SMOOTH_HINT
GL_TEXTURE_COMPRESSION_HINT
GL_FRAGMENT_SHADER_DERIVATIVE_HINT
각 타겟에 대해서 mode로 힌트를 줍니다.
속도가 최우선일때는 GL_FASTEST,
품질이 최우선일때는 GL_NICEST
아무거나 상관없으면 GL_DONT_CARE - 요게 디폴트
GL_DONT_CARE는 OpenGL이 알아서 속도와 품질을 결정합니다.
힌트는 강제적 명령이 아니며, 특정 기능이 어떤식으로 구현되었으면 좋겠다는 의미
반드시 동작한다는 보장이 없습니다. 하드웨어 그래픽카드 드라이버의 능력에 따라 다르게 결정됩니다.
그람 안티앨리어싱 예제를 보겠습니다.
#include <gl/glut.h>
void DoDisplay();
void DoMenu(int value);
bool bAlias;
bool bHint;
int main()
{
glutCreateWindow("OpenGL");
glutDisplayFunc(DoDisplay);
glutCreateMenu(DoMenu);
glutAddMenuEntry("Alias ON",1);
glutAddMenuEntry("Alias OFF",2);
glutAddMenuEntry("Hint ON",3);
glutAddMenuEntry("Hint OFF",4);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutMainLoop();
return 0;
}
void DoMenu(int value)
{
switch(value) {
case 1:
bAlias = true;
break;
case 2:
bAlias = false;
break;
case 3:
bHint = true;
break;
case 4:
bHint = false;
break;
}
glutPostRedisplay();
}
void DoDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
// 블랜딩이 켜져 있어야 알리아싱이 제대로 된다.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 안티 알리아싱 on, off
if (bAlias) {
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
} else {
glDisable(GL_POINT_SMOOTH);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_POLYGON_SMOOTH);
}
// 고품질 출력을 위한 힌트
glHint(GL_POINT_SMOOTH_HINT, bHint ? GL_NICEST:GL_FASTEST);
glHint(GL_LINE_SMOOTH_HINT, bHint ? GL_NICEST:GL_FASTEST);
glHint(GL_POLYGON_SMOOTH_HINT, bHint ? GL_NICEST:GL_FASTEST);
glPointSize(10.0);
glColor3f(1,1,1);
glBegin(GL_POINTS);
glVertex2f(0.0, 0.8);
glEnd();
glLineWidth(5);
glBegin(GL_LINE_STRIP);
glVertex2f(-0.8, 0.7);
glVertex2f(0.8, 0.5);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1,0,0);
glVertex2f(0.0, 0.4);
glColor3f(0,1,0);
glVertex2f(-0.4, 0.0);
glColor3f(0,0,1);
glVertex2f(0.0, -0.4);
glColor3f(1,1,0);
glVertex2f(0.4, 0.0);
glEnd();
glFlush();
}
선과 똥그래미의 각이 안티앨리어싱을 통해서 사라지는게 보이시죠?
검정색과 흰색의 경계에 회색을 살짜쿵 집어넣는게 기법입니다.
힌트의 효과는 사각형이 너무 단순해서 효과를 느낄 수 있는 정도는 못됩니다.
'Graphics > OpenGL' 카테고리의 다른 글
OpenGL 기초 - GLUT : 입력처리 (0) | 2014.05.27 |
---|---|
OpenGL 기초 - GLUT (0) | 2014.05.19 |
OpenGL 기초 - 블렌딩 (0) | 2014.05.17 |
OpenGL 기초 - 점, 선, 삼각, 사각, 다각형 (0) | 2014.05.17 |
OpenGL 기초 - 상태머신, 버전조사 (0) | 2014.05.16 |