전체 글 127

Chapter13. 조명과 음영

빛과 그림자 "Let there be Light" 조물주가 세상을 만들 때 가장먼저 빛을 만들었다. 빛이 없으면 사물을 보는 것이 불가능하다 사물의 색상은 빛이 물체에 흡수/반사됨을 통해 만들어진다 빛이 물체에 비췰 때 그림자가 생성된다 조명에 따라 물체에 음영이 발생한다 빛의 종류 빛은 스스로 빛을 발산하는 광원(태양, 빛, 형광등 등..)으로부터 나옴 그리고 다른 물체에서 반사되어서 나오는 빛. 그래픽스에서는? 전역 조명과 지역 조명으로 나뉜다. 전역 조명 : 모든 곳에서 빛이 존재한다. 다른 물체에서 반사되어서 나오는 빛을 일일히 계산하기 어려워 만든 빛이다. 아무리 구석으로 들어가도, 문을 닫아도 빛은 존재한다. 지역 조명 : 광원에서 직접적으로 입사되는 빛 광원 광원은 스스로 빛을 발하는 물체이..

Computer Graphics 2021.06.08

Chapter12. 에일리어싱과 안티 에일리어싱

에일리어싱 원 신호 중 일부만 사용하기 때문에 발생하는 신호왜곡 야구를 할때 야구공이 날라옴에 따라 수 많은 위치적 변화가 발생할텐데, 동체시력이 좋은 사람은 이 위치를 모두 캐치해서 공을 치겠지만 동체시력이 안좋은 사람들은 위치를 놓치게되고 헛스윙을 할 것이다. 이 것과 같은 이치이다. 그래픽스 세계에서 에일리어싱은 어떨까? 우리가 3차원 공간 상의 레스터 그래픽에서는 정점 사이를 잇고, 이를 통해 모델링을 하게되는데 이를 래스터 그래픽으로 화소에 그리게 되면 아래 그림과 같은 모습일 것이다. 이러한 왜곡된 모습을 에일리어싱이라고 칭한다. 안티 에일리어싱 위에서 살펴본, 래스터 변환을 함에 따라서 발생하는 에일리어싱(계단 현상)을 해결하기 위해서 어떤 방식을 사용해야할까? 첫번째로, 더 많은 화소를 지..

Computer Graphics 2021.06.07

Chapter11. 래스터 변환

래스터 그래픽과 벡터그래픽 Vector Graphic : 두 좌표를 기준으로 연결된 선을 그리는 방식으로, 옛날 혹은 디스플레이에 선만 그려도되는 시스템에 사용된다디화소의 개념이 없어 해상도가 무한이다. 따라서 엘리어싱 문제(픽셀이 소실되는 문제), 프레임 버퍼 등이 없다. Raster Graphic : 래스터(Raster)는 그래픽스 시스템 안의 프레임 버퍼에서 화소(Pixel)의 2차원 배열(Array)을 의미한다. 한 픽셀들은 단일 색을 가지고 있고 이 픽셀을 채워나감으로써 하나의 그림이 완성되는 것. 그럼, 지난 시간까지 우리가 한 것은 뭘까? 가상의 3차원 공간 상에 그리고자 하는 물체를 놓았다. 그리고 그 물체에 기하변환을 가하여 원하는 모습으로 변환시켰다(모델 변환). 그리고 카메라의 위치나..

Computer Graphics 2021.06.07

Chapter10. 가시성 판단

가시성 판단이란? 가시성 판단이란 3차원 상에 존재하는 물체를 카메라로 촬영할 때 카메라로 촬영되는 부분(가시 부피) 외의 물체를 자르거나, 다른 물체에 의해 가려지는 물체를 자르거나, 뒷면을 자르는 등의 판단을 하는 것이다. 즉, 촬영해서는 안될 부분(가시 부피 외의 공간, 다른 물체에 가려진 부분)과 촬영하지 않아도 되는 부분(물체의 뒤쪽 면)을 판단함으로써 성능을 향상시키고 좀 더 명확한 world를 표현할 수 있게된다. 벡터 가시성 판단을 이해하기 위한 벡터의 기본 개념을 훑고 지나간다 유클리드 벡터 실수 공간 상에서 존재한다 방향과 크기만 존재하며, 시작점은 무시한다 그래픽스에서는 2,3차원 벡터를 다룬다 방향이 없이 크기만 있는 것이 스칼라(scalar)이다. 평면 두개의 벡터가 있으면, 두 ..

Computer Graphics 2021.06.06

Chapter09. 투영변환(gluPerspective) & 뷰포트 변환(glViewport)

투영 변환 지난 시간까지는 모델에 기하변환을 가하여 모델변환을 시키고, 전역 좌표계와 모델 좌표계에 대해서 공부했으며 카메라 좌표를 변환시켜서 시점을 변환시켰다. 이제는 카메라로 세계를 촬영했을 때, 촬영되지 않는 부분과 촬영되어지는 부분에 대해서 학습할 것이다. 카메라를 가까이서 촬영하여 보이지 않을 수도 있고 특정 오브젝트가 촬영되어지는 부분에서 벗어나서 촬영되지 않을 수 있다. 따라서, 촬영되지 않는 부분들을 삭제해주어야 하는데, 이 것이 투영변환 과정에 포함된다. 이 투영 변환은 크게 정사투영(Orthographics Projection), 원근투영(Perspective Projection)에 따라 달라진다. 정사투영(Othographics Projection) 정사투영은 쉽게말해서 원근감을 고려..

Computer Graphics 2021.06.05

Chapter08. 시점변환(gluLookat)

시점 변환 지난 시간까지 모델변환을 통해서 Object의 기하변환을 가하였고, 전역 좌표계와 모델 좌표계 등에 대해서 알았다. 이젠 Viewer의 관점에서 오브젝트를 어디서, 어떤 방향으로 볼 것인지를 결정해줄 것이다. 가장 핵심적인 함수는 gluLookat이고 이전 시간에도 사용해왔다. void WINAPI gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez, GLdouble centerx,GLdouble centery,GLdouble centerz, GLdouble upx,GLdouble upy,GLdouble upz ); : View Transform Matrix를 정의하는 함수 : 시점 좌표계를 정의하는 함수로, (eyeX, eyeY, eyeZ)에 있는 카..

Computer Graphics 2021.06.05

Chapter07. GL-Viewing : 행렬&좌표계&모델 변환

Homogeneous 좌표계우리는 3차원 공간상의 오브젝트의 위치를 나타낼 때 (x,y,z)좌표를 이용한다. 그리고 그 오브젝트는 수많은 정점(vertex)로 이루어져 있기 때문에 하나하나의 정점 모두가 3차원 좌표를 가지고 있을 것이다. 하지만 호모지니어스 좌표계에서는 또 하나의 좌표인 w를 제시하였으며 이제 (x,y,z,w)벡터를 이용해야 한다. 아래를 머릿속에 박아두자w == 1이면, 벡터(x,y,z,1)은 공간상에서의 위치이다.w == 0이면, 벡터(x,y,z,0)은 방향이다.이제부터 하나하나 살펴보면서, 이 둘의 차이도 함께 알아보자변환 행렬3D 그래픽스에서는 4x4행렬을 주로 사용하며, 이들은 (x,y,z,w)버텍스들을 변형하게 해준다. 이는 버텍스를 행렬로 곱함으로써 이루어진다. 행렬 x 버..

Computer Graphics 2021.06.01

Chapter06. 디스플레이 리스트

디스플레이 리스트 Display 콜백함수에서 계산을 줄이기 위한 그래픽 속도 향상 솔루션 Display 콜백함수에서 Object의 색상 점 등을 계산하면 display 시의 load가 커짐 Object의 수가 많아지고, 복잡해 질 수록 속도 저하 Object를 미리 만들어 list에 넣어 두고, 콜백 함수에서는 이를 재사용 예시 코드 int list_id // 전역변수 생성 void createList(){ list_id = glGenLists(1); // list 1개 생성 glNewList(list_id, GL_COMPILE); //list의 시작, 컴파일(계산)만 수행함 glBegin(GL_POLYGON); //그릴 내용 glEnd(); glEndList();//리스트 종료 } createList(..

Computer Graphics 2021.05.31

Chapter 05. 정점 배열과 3차원 도형 그리기

#include #include #include #define _WINDOW_WIDTH 800 #define _WINDOW_HEIGHT 800 GLfloat MyVertices[8][3] = {{-0.25,-0.25,0.25},{-0.25,0.25,0.25},{0.25,0.25,0.25}, {0.25,-0.25,0.25},{-0.25,-0.25,-0.25},{-0.25,0.25,-0.25}, {0.25,0.25,-0.25},{0.25,-0.25,-0.25}}; //정육면체의 8개의 정점 3차원 좌표(꼭지점) //순서대로 0부터 7번의 번호가 매겨질 것이다.(밑에서) GLfloat MyColor[8][3] = {{0.2,0.2,0.2},{1.0,0.0,0.0},{1.0,1.0,0.0}, {0.0,1.0,0..

Computer Graphics 2021.05.28

Chapter04. 애니메이션과 더블버퍼링

애니메이션 애니메이션은 여러 프레임에 존재하는 이미지들을 빠른 속도로 계산, 재생함으로써 특정 물체가 부드럽게 움직이도록 한다. 그런데, 현재 우리가 보고 있는 동영상, 영화, 게임들은 하나의 객체만 처리하는 것이 아니고 수 많은 그래픽 작업들을 요구하게 된다. 프레임 마다의 장면을 처리함에 있어서 많은 처리량이 요구될 것이다. 따라서, 현 프레임의 장면을 계산하고 디스플레이에 뿌려준 다음 또 다시 프레임의 장면을 계산하고 디스플레이에 뿌려주는 단순한 방법으로 애니메이션을 처리한다면 Delay가 발생할 수 밖에 없다. 즉, 뚝뚝 끊켜 보일 것이다. 이를 처리하기 위해 Double Buffering기법이 요구된다. Double Buffering https://codejb.tistory.com/39

Computer Graphics 2021.05.28