open:opengl

OpenGL

OpenGL

참고
	http://www.winapi.co.kr/project/library/opengl/opengl.html
	OpenGLExam.zip
1.OpenGL
	3차원
		복잡하고 많은 연산
			변환
			채색
			조명
			텍스처
			그림자
	3D 그래픽 라이브러리 중 하나
	3차원기반
		가상현실(VRML)
		증강현실
	변화
		모바일 환경의 대중화
			3차원 그래픽의 사용처가 늘어남
		HTML5
			3차원 그래픽 공식 지원
		웹의 표준 3차원 그래픽
			WebGL
				OpenGL ES 2.0을 기반으로 한다.
	특징
		그래픽 라이브러리
			구체성을 기준
				고수준
				저수준
					OpenGL
	언어가 아니며 250개의 함수로 구성된 라이브러리 이다. 
	라이브러리
		GL
			가장 기본적인 그리기 기능을 제공하는 핵심 라이브러리이며 OpenGL의 본체에 해당한다. 기초 도형을 랜더링하는 함수들이 포함되어 있다. 시스템 디렉토리에 opengl32.dll(773K) 파일로 제공되며 미리 설치되어 있다.
		GLU
			GL의 도우미 역할을 하는 유틸리티 라이브러리이다. 분할, 투영 등의 고급 기능을 제공하며 원구나 원뿔, 원기둥 등의 테스트 입체 도형을 생성하는 편의 기능도 제공한다. glu32.dll(127K) 파일로 제공된다. 내부적으로 GL 함수를 호출하므로 GL의 일부로 취급하기도 한다.
	순수한 그래픽 라이브러리이며 그래픽 관련 기능만 제공한다
	운영체제별 OpenGL 보조 라이브러리(AUX)
		운영 체제
			라이브러리
		유닉스 X 윈도우
			GLX
		윈도우즈
			WGL
		애플 매킨토시
			AGL
		IBM OS/2
			PGL
	GLUT(GL Utility Toolkit)
		GLUT은 운영체제를 추상화함으로써 동일한 예제를 다양한 운영체제에서 실행할 수 있도록 한다
2.첫번째 예제
	
		GLUT는 OpenGL의 일부가 아니므로 운영체제에 포함되어 있지 않다. 그래서 다운로드받아 설치해야 한다. GLUT는 OpenGL의 홈 페이지에서 쉽게 구할 수 있다. 다음 사이트를 방문해 보자.
		http://www.opengl.org
		glut-3.7.6-bin.zip
			각 파일들을 해당 폴더로 복사하면 GLUT 설치가 완료된다. DLL 파일은 운영체제의 System32 폴더로 복사하고 헤더 파일과 임포트 라이브러리(*.lib)는 컴파일러의 해당 폴더로 복사한다. 복사 위치는 컴파일러 버전에 따라 다른데 VS 2010 버전의 경우 다음 경로에 복사한다.
			 glut32.dll to %WinDir%\System, 
			       glut32.lib to $(MSDevDir)\..\..\VC98\lib, and 
			       glut.h     to $(MSDevDir)\..\..\VC98\include\GL.
	소스
		
			
			
	진입함수
		glutCreateWindow("OpenGL");
			윈도우생성
		glutDisplayFunc(DoDisplay);
			그리기 함수 지정
		glutMainLoop();
			메시지 루프 실행
			사용자 입력 등의 사건에 대해 반응하는 이벤트 드리븐 방식으로 동작
			메시지를 받았을 때 적당한 함수를 호출
			메시지 루프는 프로그램이 종료될 때까지 계속 실행된다.
		이 외
			특수한 초기화 명령
			콜백 함수 지정
		 glFlush는 버퍼를 비워 명령을 즉시 실행시킨다. 이 호출을 생략하면 정점만 정의될 뿐 출력은 나가지 않는다.
3.OpenGL의 기초
	기본 타입
		
		OpenGL의 GLint는 항상 32비트이다.
		실수 타입
			 GLclampf, GLclampd의 clamp라는 단어의 의미는 값의 범위가 0.0 ~ 1.0 사이로 제한된다는 뜻
			색상의 강도나 텍스처의 좌표처럼 범위가 명확한 값을 지정할 때 이 타입을 흔히 사용
			타입명에 clamp가 들어 있으면 유효한 값은 0 ~ 1 사이임을 바로 알 수 있다.
	OpenGL의 함수 형식
		일반 함수와 구분하기 위해 예외없이 접두어가 붙는다
		gl 라이브러리의 함수는 gl 접두어로 시작하고 

glu의 라이브러리는 glu로 시작한다. 마찬가지로
glut 소속의 함수는 glut 접두가 붙는다.
접두만으로도 OpenGL 함수임을 쉽게 알 수 있다.

		개수, 타입, 배열 여부의 모든 조합을 취하면 

glVertex 함수만 해도 3 * 4 * 2 = 24개의 함수 그룹이 정의된다.

			glVertex[2,3,4][s,i,f,d][v](x,y,z,w)
		 특정 함수명을 인터넷으로 검색할 때도 접미는 빼고 검색하는 것이 바람직하다.
	색상 변경
		void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
			 다음 함수로 배경색을 바꿔 보자.
		void glClear(GLbitfield mask);
			배경을 실제로 지울 때는 다음 함수를 호출한다.
			
	상태 머신
		OpenGL은 그리기에 필요한 여러 가지 정보들을 상태 머신(State Machine)에 저장한다.
		상태 머신이란 상태를 저장하는 장소이며 그리기에 영향을 미치는 여러 변수값들이 집합이다.
		상태 머신은 전역적이며 영속적인 저장소이므로 한번 지정해 놓은 상태 변수는 다른 값으로 바꾸기 전에는 계속 유효하다. 
		 진위형이 아닌 상태값은 다음 함수들로 조사한다.
			void glGetIntegerv(GLenum pname, GLint * params);
			void glGetFloatv(GLenum pname, GLfloat * params);
			void glGetDoublev(GLenum pname, GLdouble * params);
			void glGetBooleanv(GLenum pname, GLboolean * params);
			첫번째 인수는 알고 싶은 상태 변수 값이며 두 번째 인수는 상태값을 리턴받을 배열이다.
				GLfloat arColor[4];
					색상은 4개의 실수로 구성되므로 배열 크기도 4로 준비해야 한다.
				glGetFloatv(GL_CURRENT_COLOR, arColor);
		복잡한 출력을 하려면 상태를 자주 바꿔야 하는데 이전 상태값으로 그대로 돌아 오려면 스택에 저장해 놓는 것이 편리하다.
	버전 조사
		다음 두 함수는 GL과 GLU 라이브러리 자체에 대한 정보를 조사한다.
			const GLubyte* glGetString(GLenum name);
			const GLubyte * gluGetString(GLenum name);
			name 인수로 어떤 정보를 조사할 것인지를 지정하며 조사 결과는 문자열로 리턴된다
				
		그리기와는 직접적인 상관이 없지만 특정 기능의 지원 여부를 조사할 때 이 정보가 필요하다.
4.기본 도형
	4-1.점
		3차원 그래픽의 가장 원자적인 요소는 정점(Vertex)이다
		
	4-2.선
		void glLineStipple(GLint factor, GLushort pattern);
			선의 모양은 다음 함수로 지정한다.
	4-3.삼각형
		2차원 그래픽의 기본 요소는 픽셀이지만 3차원 그래픽의 기본 요소는 삼각형이다.
	4-4.사각형
		void glRect[i,s,f,d][v](x1, y1, x2, y2)
			완전히 독립된 함수이므로 glBegin ~ glEnd 블록에 포함시키지 않고도 사각형을 그릴 수 있다.
	4-5.다각형
		GL_POLYGON은 모든 정점을 하나로 연결하여 다각형을 그린다.
	4-6.블랜딩
		화면에 그려진 그림은 색상 버퍼라는 메모리에 저장된다. 
		블랜딩은 색상 버퍼에 이미 기록되어 있는 값 D와 새로 기록되는 값 S와의 연산을 정의한다. 
		
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	4-7.안티 알리아싱
		디지털 화면에서 나타나는 계단 현상 등을 알리아스라고 하며 이런 현상을 제거 또는 감소시키는 기술을 안티 알리아싱(Anti Aliasing)이라고 한다. 
		함수
			glEnable(GL_POINT_SMOOTH);
			glEnable(GL_LINE_SMOOTH);
			glEnable(GL_POLYGON_SMOOTH);
		// 블랜딩이 켜져 있어야 알리아싱이 제대로 된다.
	블록
		void glBegin(GLenum mode);
		void glEnd(void);
5.GLUT
	glutInit 함수가 하는 가장 중요한 일은 에러 처리이다.
	모든 윈도우 시스템은 이벤트 드리븐 방식으로 동작한다.
	콜백함수
		메시지를 처리하는 콜백 함수는 메시지 루프로 들어가기 전에 다음 함수들로 미리 등록해 두어야 한다.
		void glutDisplayFunc(void (*func)(void));
		void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
		void glutMouseFunc(void (*func)(int button, int state, int x, int y));
		void glutReshapeFunc(void (*func)(int width, int height));
		glutMainLoop는 끊임없이 메시지 큐를 감시하며 메시지가 들어올 때마다 대응되는 콜백 함수를 계속 호출한다.
		이미 등록한 콜백을 해제할 때는 인수로 NULL을 전달한다.
	void glutPostRedisplay(void);
		이 함수는 윈도우가 다시 그려져야 함을 표시하기만 할 뿐 즉시 그리기를 하지는 않는다
	5-4.애니메이션
		타이머 구현은 운영체제마다 다르지만 GLUT의 다음 함수를 호출하면 운영체제에 상관없이 타이머를 만들 수 있다.
		애니메이션을 할 때는 더블 버퍼링을 사용하는 것이 좋다. 
			전면(Front buffer 또는 On Screen Buffer)
			후면(Back Buffer 또는 Off Screen Buffer)
		더블 버퍼링 옵션이 켜지면 그래픽 카드는 항상 전면 버퍼를 모니터에 뿌리지만 모든 그리기 동작은 백 버퍼에서 수행된다.
	5-5.Win32 OpenGL 예제
		GLUT은 어디까지나 플랫폼 추상층을 제공하는 도우미일 뿐 OpenGL의 필수 도구는 아니다.
		GLUT을 사용하지 않고도 AUX 라이브러리를 제공하는 임의의 플랫폼에서 동작하는 완벽한 OpenGL 프로그램을 만들 수 있다는 얘기이다. 
6.입체 도형
	6-1.3차원 좌표
		좌표
			OpenGL의 3차원 공간은 다음과 같은 좌표계로 정의되어 있다.
			좌표의 범위는 x, y, z 모두 -1 ~ 1 사이이다.
	6-2.깊이 테스트
		깊이
			2차원 그래픽과 3차원 그래픽의 주요한 차이점
			깊이 버퍼는 색상 버퍼와는 다른 완전히 분리된 메모리 영역이다.
			화면을 삭제할 때 색상 버퍼외에 깊이 버퍼도 같이 삭제해야 한다.
				glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	6-3.와인딩 모드
		디폴트 와인딩은 반시계 방향으로 정의되어 있으며 관찰자가 보기에 반시계 방향으로 그려진 면이 도형의 앞으로 간주된다.
		불필요한 그리기를 하지 않는 이런 기법을 컬링(Culling)이라고 한다
	6-4.폴리곤 모드
		다각형 채색 방식을 결정하는 것을 쉐이드 모델이라고 한다.
	6-5.에지 플래그
		OpenGL의 규칙상 다각형은 반드시 볼록해야 하며 오목해서는 안된다.
	6-6.3차원 물체

  • open/opengl.txt
  • 마지막으로 수정됨: 2020/06/02 09:25
  • 저자 127.0.0.1