Download presentation
Presentation is loading. Please wait.
1
알아야 할 것들
2
알아야 할 것들 “ 에 러 처 리 ” “ OpenGL 버전 확인하기” “ 표준 확장 ” “ 간단한 반투명 ”
“ 에 러 처 리 ” “ OpenGL 버전 확인하기” “ 표준 확장 ” “ 간단한 반투명 ” “ 쉬운 페이드 효과 ” “ 백 버퍼를 이용한 물체 선택 ” 2011-2학기 가상현실
3
“ 스텐실 버퍼를 사용해서 채워진 오목 폴리곤 그리기 “ “ 간섭 영역 찾기 ” “ 그림자 ”
“ 경제적인 이미지 변형 ” “ 레이어 표현하기 ” “안티앨리어싱된 문자들” “ 둥근 점 그리기 ” “ 이미지 보간하기 ” “ 전사한 그림 만들기 ” “ 스텐실 버퍼를 사용해서 채워진 오목 폴리곤 그리기 “ “ 간섭 영역 찾기 ” “ 그림자 ” 2011-2학기 가상현실
4
“ 디리클레 영역 (Dirichlet Domain)“ “ 스텐실 버퍼의 라이프 “
“ 은선 제거하기 ” “ 텍스처 매핑 응용프로그램 ” “ 깊이 버퍼를 사용하는 이미지 그리기 ” “ 디리클레 영역 (Dirichlet Domain)“ “ 스텐실 버퍼의 라이프 “ “ glDrawPixels()와 glCopyPixels()의 선택적 사용 ” 2011-2학기 가상현실
5
에 러 처 리 OpenGL은 기본 GL이나 GLU에서 에러를 감지할 경우, 현재 에러 코드를 기록해 놓는다.
한번 에러가 기록되면 glGetError()를 호출, 에러 코드를 반환하기 전까지 현재 에러 코드가 안지워짐 그러므로 추가적인 에러들이 기록 안된다. glGetError()는 현재 에러 코드를 알아내고 에러 코드를 지운 이후나, 발생한 에러가 없을 경우에 호출되었을 경우 GL_NO_ERROR를 반환 2011-2학기 가상현실
6
GLenum glGetError(void);
GL이나 GLU에서 에러가 발생했을대 적절한 에러 코드값으로 바뀐 에러 플래그값을 반환 이 함수의 반환값이 GL_NO_ERROR라면 마지막으로 glGetError()가 호출된 이후나 GL이 초기화 된 이후로 감지할 수 있는 에러가 없음을 의미 display() 루틴 동안에 적어도 한번은 glGetError()함수를 호출해 주는 것이 좋다. 2011-2학기 가상현실
7
OpenGL 에러 코드 에러 코드 설명 GL_INVALID_ENUM GLenum 인자가 범위를 벗어남
GL_INVALID_VALUE 수 인자가 범위를 벗어남 GL_INVALID_OPERATION Operation이 현재 불법적 GL_STACK_OVERFLOW 스택 오버플로우가 발생 GL_STACK_UNDERFLOW 스택 언더플로우가 발생 GL_OUT_OF_MEMORY 커맨드를 실행시키기 위한 메모리 여유가 충분하지 않다 2011-2학기 가상현실
8
gluErrorString()을 사용해서 GL 에러코드나 GLU 에러코드에 대한 설명을 얻어낼 수 있다.
const GLubyte * gluErrorString(GLenum errorCode); 이 함수는 errorCode로 넘어온 OpenGL이나 GLU 에러 번호에 맞는 에러 설명 문자열의 포인터를 반환 2011-2학기 가상현실
9
내가 사용하는 것은 무슨 버전인가? const GLubyte * glGetString(Glenum name);
OpenGL 구현을 설명하는 문자열에 대한 포인터를 반환 name은 GL_VENDOR, GL_RENDERER, GL_VERSION, 또는 GL_EXTENSIONS 이 네 가지 값 중에 하나의 값을 가짐 GL_VENDOR는 OpenGL개발에 대한 책임을 갖는 회사의 이름을 반환 GL_RENDERER는 보통 하드웨어 플랫폼 같은 렌더링 식별자를 반환 2011-2학기 가상현실
10
gluGetString() 은 유틸리티 라이브러리에서 사용하는 질의 함수로, glGetString()과 유사
유틸리티 라이브러리 버전 gluGetString() 은 유틸리티 라이브러리에서 사용하는 질의 함수로, glGetString()과 유사 const GLubyte * gluGetString(GLenum name); OpenGL 구현을 설명하는 문자열에 대한 포인터를 반환 윈도우 시스템 확장 버전 OpenGL을 위한 윈도우 시스템 확장의 버전 정보를 얻기 위해 사용하는 glXQueryExtensionString()과 같은 루틴들이 있다. 2011-2학기 가상현실
11
표 준 확 장 OpenGL은 라이브러리와 연산들에 대해 공식적으로 기술하고 있는 명세를 가짐
XYZ 회사가 새로운 함수와 심볼 상수를 추가 glCommandXYZ() 형태가 됨 GLboolean gluCheckExtension(char *extName, const GLubyte * extString); 명시된 확장의 지원 여부를 알아보기 위함 extName이 extString에서 발견될 경우 GL_TRUE를 반환 그렇지 않으면 GL_FALSE 반환 2011-2학기 가상현실
12
Microsoft Windows에서의 표준 확장(WGL)
마이크로소프트 윈도우 플랫폼에서는 다음과 같은 방법으로 확장 함수를 사용 확장을 확인할 수 있는 심볼 상수를 이용해서 조건 확인 코드를 만들어 냄 런타임 때 확장 문자열을 질의 wglGetProcAddress() 함수를 이용해서 포인터와 확장 함수를 연결 2011-2학기 가상현실
13
간단한 반투명 불투명한 물체를 표현하기 위해 폴리곤 스티플을 사용할 수 있다.
이 방법은 특히 하드웨어가 블렌딩을 지원하지 않는 시스템에서 유용하게 사용할 수 있는 방법이다. 만약 빛을 29퍼센트 투과시키는 표면을 만들고 싶다면 간단하게 마스크의 29퍼센트는 0이고 나머지는 1인 스티플 패턴을 만든다 만약 임의의 픽셀을 켜서 만드는 효과가 싫다면 규칙적인 패턴을 사용할 수도 있다. 이 패턴들은 투명한 표면이 쌓여 있을 때 좋지 않은 결과를 만들어내기도 한다. 2011-2학기 가상현실
14
쉬운 페이드 효과 점차적으로 배경색과 같은 색으로 빛깔이 바래지는 이미지를 만들어내기 위해서는
먼저 패턴이 밀집된 곳에서 더 많은 비트들이 켜진 폴리곤 스티플을 정의해야 한다. 16단계의 검은색 페이드를 원하면 16개의 서로 다른 패턴 배열을 정의 GLubyte stips[16][4*32]; 각각의 32 * 32 스티플 패턴에서 픽셀의 1/16을 켜고, 모든 스티플 패턴의 비트 방식 OR를 1로 설정, 읽어옴 2011-2학기 가상현실
15
스티플 패턴을 디스플레이 목록으로 설정하는 커맨드를 컴파일 하면
OpenGL은 stips[][] 배열에 있는 자료들을 최고 스티플 설정 속도가 필요한 하드웨어 의존적인 형태로 재정렬 가능 이 기술은 또한 움직이는 그림을 그릴 때도 이용 그림 중에서도 매우 빠른 동작을 묘사하기 위해서 그림이 지나간 자리에 흔적을 남기고, 순차적으로 사라지는 기법 2011-2학기 가상현실
16
glPolygonStipple(&stips[i][0]);
GLubyte stips[16][4*32]; draw_the_picture(); glColor3f(0.0, 0.0, 0.0); for (i=0; i<16; i++) { glPolygonStipple(&stips[i][0]); draw_a_polygon_large_enough_to_cover_the_whole_region(); } 2011-2학기 가상현실
17
백버퍼를 이용한 물체 선택 OpenGL 선택 메커니즘을 사용하지 않고 더블버퍼 모드에서 오브젝트 선택
백버퍼를 이용한 물체 선택 OpenGL 선택 메커니즘을 사용하지 않고 더블버퍼 모드에서 오브젝트 선택 이 방법은 사용자가 오브젝트를 피킹하면 응용프로그램이 백 버퍼에 전체 장면을 다시 그려준다 백 버퍼에 장면을 그릴 때 오브젝트의 일반적인 컬러를 사용하는 대신 오브젝트 컬러에 대한 식별자를 코드화 해서 그려준다. 어플리케이션은 커서 아래에 있는 픽셀을 읽고 피킹된 오브젝트의 값으로 픽셀의 값을 코드화 2011-2학기 가상현실
18
하나의 픽셀에 복합적인 오브젝트가 놓여 있을 때
이 기법은 가장 앞에 놓인 오브젝트를 선택하기 때문에 일반적인 선택모드 기법 이상의 장점을 가짐 만약 다른 시스템에서 돌아갈 수 있는 이식 가능한 코드를 쓰고자 한다면 물체의 식별자를 사용하고자 하는 시스템들의 가장 작은 크기에 맞추어서 쪼개야 한다 2011-2학기 가상현실
19
경제적인 이미지 변형 비트맵 이미지를 늘이거나 회전, 수학적 함수를 이용, 수정하는 등 왜곡된 형태의 이미지를 만들기 위한 다양한 방법 사용 가능 이미지를 텍스처 맵의 형태로 사용해서 스케일링이나 로테이션 등의 변화 가능 glPixelzoom()을 사용해서 이미지를 스케일링 시킬 수도 있다. 2011-2학기 가상현실
20
레이어 표현하기 반도체 레이아웃 프로그램 같은 응용프로그램에서는
서로 다른 물체들 간에 다중 레이어를 그려주고, 오버랩을 표시해야 하는 경우가 있다. 간단한 예제로 계층화할 수 있는 서로 다른 세 개의 물질이 있다고 가정하자 다음 표에서 보는 것과 같이 레이어들의 조합을 8개 만들 수 있다. 2011-2학기 가상현실
21
레이어들의 8가지 조합 레이어1 레이어2 레이어3 컬러 없음 검정색 1 있음 빨간색 2 초록색 3 파란색 4 분홍색 5 노란색
없음 검정색 1 있음 빨간색 2 초록색 3 파란색 4 분홍색 5 노란색 6 흰색 7 회색 2011-2학기 가상현실
22
이미지를 그릴 때에는 컬러를 7로 설정하고 n번 레이어에 있는 물체를 그릴 때는 쓰기 마스크를 n번으로 설정한다.
윈도우를 클리어할 때는 세 개 레이어를 모두 포함하기 위해서 쓰기 마스크 (write mask) 를 7로 설정하고, 클리어하는 컬러는 0으로 설정 이미지를 그릴 때에는 컬러를 7로 설정하고 n번 레이어에 있는 물체를 그릴 때는 쓰기 마스크를 n번으로 설정한다. 레이어별로 그림을 지워주려면 원하는 레이어의 번호로 쓰기 마스크를 설정하고, 컬러를 0으로 설정해준다. 2011-2학기 가상현실
23
안티앨리어싱된 문자들 문자를 그리기 위해 glBitmap()을 이용하는 기본적인 방법을 사용하면
문자는 색이 칠해진 픽셀과 칠해지지 않은 픽셀을 모아 표현 만일 렌더링에 회색과 같은 중간색들을 사용한다면 문자의 이미지를 더욱 부드럽고 고급스럽게 표현 가능 문자와 영역 사이에 걸친 픽셀들은 픽셀이 포함된 양에 따라서 적절한 농도의 회색으로 칠해야 함 2011-2학기 가상현실
24
RGBA 모드와 컬러 인덱스 모드의 차이에 따라 안티앨리어싱 문자를 구현하는 두 가지 방법이 존재
그림 14-1에서 숫자 0, 1, 2, 3 은 각 픽셀이 덮힌 정도 0은 거의 비어있는 곳, 1은 1/3, 2는 2/3, 3은 완전히 덮혀있는 곳 의미 RGBA : 세 개의 서로 다른 문자 비트맵을 만들어 주고 만들어낸 각각의 비트맵은 글씨의 쓰여진 위치와 일치시켜야 함 컬러를 하얀색으로 설정, 배경색을 클리어 RGB를 (0.666, 0.666, 0.666) 으로 설정해서 1/3 회색 컬러를 만들고, 1인 픽셀에 칠해줌. RGB를 (0.33, 0.33, 0.33) 으로 설정해서 2번째 비트맵에 칠해줌 마지막으로 RGB=(0, 0, 0)으로 해서 3번째 비트맵에 칠해줌 2011-2학기 가상현실
25
전사한 그림 만들기 깊이버퍼를 사용해서 은면을 제거하고 있는 복잡한 3차원 그림을 그리고 있다고 가정
그리고 이 그림의 일부분이 동일한 평면에 있는 그림 A와 B로 구성되어 있고, 그림 B가 언제나 A 위에 나타나야 하는 일종의 전사한 그림을 그려야 하는 경우 일반적으로 프레그먼트를 교체하는 깊이 버퍼 함수를 이용해 A, B를 그림 점들을 표현하는 부동 소수점의 정확도에 한계가 있기 때문에 그림 B의 비트가 그림 A 앞에 나타나기도 했다가 뒤에 나타나기도 하는 문제 발생 2011-2학기 가상현실
26
이러한 문제를 해결하기 위해 다음과 같은 방법을 사용 깊이 버퍼를 쓰기 불가 상태로 만들고 A를 렌더링
깊이 버퍼를 쓰기 가능 상태로 만들고 B를 렌더링 컬러 버퍼를 쓰기 불가 상태로 만들고 , A를 다시 렌더링 컬러 버퍼를 쓰기 가능 상태로 만든다. 2011-2학기 가상현실
27
만일 스텐실 버퍼가 사용 가능하다면 다음과 같이 단순한 방법을 사용해서 똑같은 효과를 만들어 낼 수도 있다.
깊이 테스트를 통과할 경우 1을 갖고, 통과하지 못할 경우 0을 갖도록 스텐실 버퍼를 구성하고 A를 렌더링 스텐실 값은 바꾸지 않은 채로 스텐실 값이 1인 곳만 렌더링하도록 스텐실 버퍼를 구성 깊이 버퍼 테스트와 깊이 버퍼의 갱신을 불가능하게 만든 후 B를 렌더링 2011-2학기 가상현실
28
간섭 영역 찾기 간섭 영역을 찾아내는 방법은 10장의 스텐실 테스트에서 설명하는 캐핑 알고리즘과 연관되어 있다.
테스트 하고자 하는 오브젝트에 임의의 클리핑 면을 통과시켜서 오브젝트 내부를 한 번 이상 통과한 클리핑 영역을 찾아내는 것이 핵심 기술 간섭 영역을 찾아내기 위해서는 일단 확인하고 싶은 물체를 그린 후 클리핑 면에 대해서 클리핑 해주어야 함 만일 다중 물체에 대해 상호 간섭에 대한 테스트를 해야 한다면 간섭이 일어날 때마다 하나의 비트를 저장, 클리핑 버퍼가 오브젝트 내부 집합에 들어갈 때마다 또 하나의 비트를 저장 2011-2학기 가상현실
29
앞에서 설명된 연산은 다양한 마스킹 연산들과 스텐실 버퍼에 있는 다른 비트들을 이용해서 처리 가능
스텐실 연산을 이용하면 스텐실 버퍼에서 간섭과 내부 집합을 찾아낼 수 있다. 2011-2학기 가상현실
30
그림자(Shadows) 모든 3차원 공간에서 3차원 공간으로의 모든 사영은 4* 4의 역행렬이 가능한 행렬과 동차 좌표계를 이용해서 만들 수 있다. 임의의 무한한 광원으로부터 생겨나는 임의의 평면에 있는 임의의 물체에 대한 그림자를 찾으려면 먼저 그 사영을 표현하는 행렬을 찾아야 한다. 그리고 행렬 스택에 찾아낸 행렬을 곱하고 그림자 색으로 물체를 그린 후 “바닥”면에 물체를 사영해 주어야 함 2011-2학기 가상현실
31
은선 제거하기 숨겨진 선들이 제거된 와이어프레임 물체를 그려야 한다면
선으로 윤곽을 그리고, 표면을 이루는 폴리곤의 내부를 배경색으로 칠하는 방법을 사용할 수 있다. 또한 숨겨진 선을 제거하기 위해 폴리곤 오프셋을 사용하거나, 스텐실 버퍼를 사용하는 방법도 사용할 수 있다. 2011-2학기 가상현실
32
폴리곤 오프셋을 사용해서 숨겨진 선을 제거하려면 물체를 두 번 그려주어야 한다.
폴리곤 오프셋으로 숨겨진 선 제거하기 폴리곤 오프셋을 사용해서 숨겨진 선을 제거하려면 물체를 두 번 그려주어야 한다. 강조된 모서리를 그리기 위해서 폴리곤을 와이어프레임 형태로 래스터화 해주어야 하기 때문에, GL_LINE으로 폴리곤 모드를 설정해서 전경색으로 채워진 폴리곤을 그린다. 그리고 기본 폴리곤 모드에서 채워진 폴리곤을 그려주는데, 이 폴리곤은 와이어프레임의 내부를 채우기 위해 사용 충분한 폴리곤 오프셋을 사용, 이 폴리곤을 눈으로 부터 조금 멀리 밀어내 준다. 2011-2학기 가상현실
33
스텐실 버퍼를 사용해서 숨겨진 선을 제거하려면 더 복잡한 과정을 거침
스텐실 버퍼로 숨겨진 선(은선) 제거하기 스텐실 버퍼를 사용해서 숨겨진 선을 제거하려면 더 복잡한 과정을 거침 먼저 각 폴리곤은 스텐실 버퍼를 클리어 프레임버퍼와 스텐실버퍼 두 곳에 모두 외곽선을 그려주어야 함 그 다음 내부를 채우고 스텐실 버퍼 중 여전히 클리어 상태인 곳에서만 그리기를 활성화 폴리곤 마다 전체적인 스텐실 버퍼를 클리어하지 않도록 같은 폴리곤 외곽선을 사용하는 버퍼를 0으로 만들어서 클리어 2011-2학기 가상현실
34
텍스처 매핑 응용프로그램 텍스처 매핑을 활용한 어플리케이션 안티앨리어싱된 텍스트
비교적 해상도가 놓은 곳에 있는 각 문자들에 대해 텍스처맵을 정의한 다음, 이 텍스처맵을 텍스처가 제공하는 필터링을 사용해서 더 작은 영역에 매핑 이 방법을 사용하면 왜곡된 면에서도 정확하게 표현 안티앨리어싱된 선 텍스처 위에 여러 픽셀의 넓은 선을 그리고, 텍스처 필터링을 사용해 안티앨리어싱 이미지 스케일링과 로테이션 이미지를 텍스처 맵 안에 놓고, 텍스처를 폴리곤 위에 매핑하면 폴리곤을 돌리고 늘어뜨리는 효과가 이미지에 적용 2011-2학기 가상현실
35
평가자를 이용해서 만들어내는 얇은 판막으로 정의된 표면에 이미지를 매핑해서 텍스처 맵처럼 저장
이미지 구부리기 평가자를 이용해서 만들어내는 얇은 판막으로 정의된 표면에 이미지를 매핑해서 텍스처 맵처럼 저장 이미지 사용하기 이미지 텍스처 맵에 놓고, 슬라이트 프로젝터 효과가 나도록 스포트라이트처럼 사영 2011-2학기 가상현실
36
깊이 버퍼를 사용하는 이미지 그리기 복잡한 정적 배경의 경우, 배경의 기하학적인 명세를 렌더링하는데 걸리는 시간이 이미지 그리는 시간보다 오래 걸림 고정배경 및 단순하게 변화하는 전경의 경우 기하학적으로 렌더링하기 보다 이미지를 깊이 버퍼버전과 결합하여 그리는 것이 좋을 수도 있다. 깊이 버퍼된 이미지를 장면에 추가하려면, 먼저 glDrawPixels()를 사용해서 이미지의 깊이 버퍼값을 깊이 버퍼에 적어주어야 함 그 다음, 깊이 버퍼링을 활성 상태로 만들고 그리는 것을 막기 위해 쓰기 마스크를 0으로 바꾼다. 2011-2학기 가상현실
37
그리고 깊이 버퍼에 쓰기 작업이 일어날 때마다 그려진 것을 스텐실 버퍼가 얻어올 수 있도록 스텐실 작업을 활성 상태로 만듬
스텐실 버퍼에 1이 있을 때만 쓰기가 일어나게 하기 위해서 방금 만든 스텐실 버퍼로 마스크된 컬러 버퍼에 이미지를 그린다. 2011-2학기 가상현실
38
glDrawPixels()와 glCopyPixels()의 선택적 사용
Video : 기계가 특별한 프레임을 그려주고 버퍼를 교환하는 과정을 반복함으로써 짧은 무비 클립을 보여줄 수 있다. 에어브러쉬 : 페인트 프로그램에서 에어브러쉬의 형태는 알파값을 이용해서 만들 수 있다. glDrawPixels()를 이용해서 알파값이 큰 중심부에는 파란색 사각형을 반복적으로 그려주고, 원의 가장자리는 흐리게 그림 2011-2학기 가상현실
39
이미지 교차하기 : XOR연산을 사용한 glCopyPixels()를 이용하면 같은 크기의 이미지를 제자리에서 스왑할 수 있다.
필터링된 줌(filtered zoom) : 만약 정수가 아닌 값으로 픽셀 이미지를 확대 또는 축소시키려면 조금 간소한 앨리어싱 결과를 만들어내는 박스 필터(box filter)를 사용할 수 있다. 이미지 교차하기 : XOR연산을 사용한 glCopyPixels()를 이용하면 같은 크기의 이미지를 제자리에서 스왑할 수 있다. 만약 A와 B가 두 개의 이미지라면 연산은 다음과 같이 표현 A = A XOR B B = A XOR B A = A XOR B 2011-2학기 가상현실
Similar presentations