간단프로그래밍2011. 6. 19. 00:09



오로지 점찍는 함수만 써야 한다.


따라서 오브젝트 를 읽어들이고 적당한 구조로 저장한다.


그뒤 WC를 EC 로 perspective 변환 후 division,

이후 Viewport 변환 까지 거치게 되면

X 와 Y 값은 화면에 맞게 

Z 값은 0~65535 사이 값을 가지게 되는 점들로 좌표가 변환된다.

실제로는 삼각형을 그릴때 점을 참조할때 그 순간에 좌표 변환시킨다 (실제 opengl 동작도 이렇게 돌아가는듯)


이후 세 점을 연결하는 직선을 그리거나 (와이어 프레임)



이후 삼각형 filling 알고리즘을 사용하여 삼각형을 그린다

이 삼각형 채우는 알고리즘이 진짜 개념은 안어려운데 

짜기가 골치 아프다.

속도를 위해서 최대한으로 interpolation 을 활용해야 하는데

이때 Raster 방식으로 점이 찍힌다고 가정하므로 (Scanline)

y 값이 1씩 증가할시 x_left 나 x_right 와 같이 bound 를 구하고

또 이 bound 의 차이를 이용해서 또 interpolation 해야할 일이 생긴다 (gouraud, phong shading)

이때 주의해야 할 점은 최초 그려지는 y를  (y_bottom or y_top) 그리기 위해서

가장 가까운 정수로 변할때의 step 을 구해야 한다 이것 또한 interpolation 이다.

우선 Dx, Dy , Dz 를 구한뒤에 y가 1 증가할 때의 step 을 구한다 ,
(scanline 알고리즘을 쓸때는 픽셀이 그려질때 x가 증가할때마다 step을 구함)

그뒤 시작점이 반드시 정수임을 보장하지 못하므로

small delta 를 구해야 한다. 이는 가장 가까운 정수를 찾아 그쪽부터 그리기 시작하기

전에 그리기 시작하는 지점을 찾기위한 것이다.



이렇게 y에 대해서 left , right bound 를 구하고 나면 raster 방식으로 그릴수 있게 된다.

꼭 x bound 뿐만이 아니라, color bound , phong shading 같은 경우는 pixel이 가지는 법선벡터

에 대한 bound 를 구할수도 있다.




실제 opengl 은 삼각형 뿐만 아니라 임의의 다각형에 대해서도 동작한다 (convex 여야만 되는듯)

구현한 사람은 얼마나 골치 아팠을까 ㅋㅋㅋ
 


그리고 픽셀을 찍을 때마다 z_buffer 를 사용하여 찍어야 할지 말아야 할지 결정된다.



전부 CPU 연산이라서 부담될 줄 알았더니

생각보다 빠른 연산을 보여주었다. 초당 30프레임 가까이 나오는 셈



하지만 오브젝트 하나밖에 없었으므로 복잡한 scene 의 경우

오브젝이 수십 수백개가 존재할 경우 가시성 판단만 해도 부담될 것 같다.

 

'간단프로그래밍' 카테고리의 다른 글

opengl 확장 기능 알아보기  (0) 2011.06.28
우분투에 opengl 설치  (0) 2011.06.24
3D 렌더러 학교 플젝 소, opengl 점 찍는 함수만 사용  (0) 2011.06.19
opencv SURF 실험  (0) 2011.05.09
확장 정규식 parsing 템플릿  (0) 2010.10.04
floating point  (0) 2010.04.12
Posted by 멍충한아싸

댓글을 달아 주세요