graphics - korea universitykucg.korea.ac.kr/new/course/2010_2/cnce340/tutor/06... · 2002. 1....

39
Graphics Graphics Lab @ Korea University http://kucg.korea.ac.kr OpenGL 컴퓨터 그래픽스 연구실

Upload: others

Post on 19-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

Graphics

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

OpenGL

컴퓨터 그래픽스 연구실

Page 2: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

정 6면체void glutSolidCube(GLdouble size);

물체 겉면이 칠해진 형태

void glutWireCube(GLdouble size);물체 뼈대만 선으로 표시

size : 정육면체 모서리의 길이

http://kucg.korea.ac.kr

Page 3: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

원구void glutSolidSphere(GLdouble radius, GLint slices,GLint stacks);

물체 겉면이 칠해진 형태

void glutWireSphere(GLdouble radius, GLint slices,GLint stacks);

물체 뼈대만 선으로 표시

radius : 원구의 반지름

slices : 경선의 수 (세로)stacks : 위선의 수 (가로)

http://kucg.korea.ac.kr

Page 4: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

원환체void glutSolidTorus(Gldouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings);

물체 겉면이 칠해진 형태

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings);

물체 뼈대만 선으로 표시

innerRadius : 원환체의 안쪽 반지름

outerRadius : 원환체의 바깥쪽 반지름

nsides: 튜브 단면을 몇 개의 선분으로 근사화

rings : 튜브 윤곽을 몇 개의 선분으로 근사화

http://kucg.korea.ac.kr

Page 5: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

원뿔void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);

물체 겉면이 칠해진 형태

void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);

물체 뼈대만 선으로 표시

base : 원뿔 밑면의 반지름

height : 원뿔 높이

slices : z축 둘레를 몇 개의 선분으로 근사화

stacks : z축을 따라서 몇 개의 면으로 근사화

http://kucg.korea.ac.kr

Page 6: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

정 4면체void glutSolidTetrahedron();

물체 겉면이 칠해진 형태

void glutWireTetrahedron();물체 뼈대만 선으로 표시

http://kucg.korea.ac.kr

Page 7: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

정 20면체void glutSolidIcosahedron();

물체 겉면이 칠해진 형태

void glutWirecosahedron();물체 뼈대만 선으로 표시

http://kucg.korea.ac.kr

Page 8: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

GLUT 모델링

주전자void glutSolidTeapot(GLdouble size);

물체 겉면이 칠해진 형태

void glutWireTeapot(GLdouble size);물체 뼈대만 선으로 표시

size : 주전자의 상대적 크기

http://kucg.korea.ac.kr

Page 9: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Example

http://kucg.korea.ac.kr

Page 10: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Reshape Callback 함수

void glutReshapeFunc(void(*func)(int width, int height));

윈도우의 크기/모양이 바뀔 때 GLUT가 호출하는콜백함수를 등록시키는 함수

width : 윈도우의 새로운 너비

height : 윈도우의 새로운 높이

ex)Void myReshape(int NewWidth, int NewHeight){ … }void main(int argc, char** argv){ …

glutReshapeFunc(myReshape); //함수 등록

… }

http://kucg.korea.ac.kr

Page 11: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Keyboard Callback 함수

void glutKeyboardFunc(void(*func)(unsigned char key, int x, int y));

ASCII 코드의 키보드 입력이 일어날 때마다 GLUT가호출하는 콜백함수를 등록시키는 함수

key : 눌러진 키

x : 마우스의 X좌표, y : 마우스의 Y좌표

ex)void myKeyboard(unsigned char key, int x, int y){ … }void main(int argc, char** argv){ …

glutKeyboardFunc(myKeyboard); // 함수 등록

… }

http://kucg.korea.ac.kr

Page 12: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Keyboard Callback 함수

http://kucg.korea.ac.kr

Page 13: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Mouse Click Callback 함수

void glutMouseFunc(void(*func)(int button, int state, int x, int y));

마우스 이벤트가 발생할 때마다 GLUT가 호출하는마우스 클릭 콜백함수를 등록시키는 함수

button : 버튼의 종류

GLUT_LEFT_BUTTON , GLUT_RIGHT_BUTTON,GLUT_MIDDLE_BUTTON

state : 해당 버튼이 눌러진 상태인지 아닌지

GLUT_DOWN, GLUT_UPx : 마우스 x좌표, y : 마우스 y좌표

http://kucg.korea.ac.kr

Page 14: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Mouse Click Callback 함수

void glutMouseFunc(void(*func)(int button, int state, int x, int y));

ex)void myMouseClick(Glint button, GLint state, GLint x, GLint y){if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

{ … }}void main(int argc, char** argv){ …glutMouseFunc(myMouseClick); // 함수 등록

… }

http://kucg.korea.ac.kr

Page 15: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Mouse Motion Callback 함수

void glutMotionFunc(void(*func)(int x, int y));마우스 버튼을 누른 상태에서 마우스를 움직일 때호출되는 마우스 움직임 콜백함수를 등록시키는 함수

x : 마우스의 X좌표

y : 마우스의 Y좌표

ex)void myMouseMotion(GLint x, Glint y){ … }void main(int argc, char** argv){ …

glutMotionFunc(myMouseMotion); // 함수 등록

… }

http://kucg.korea.ac.kr

Page 16: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Mouse 함수 관련 예제

http://kucg.korea.ac.kr

Page 17: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Double Buffering

프레임 버퍼

그래픽 프로세스가 프레임 버퍼에 영상을 그리는 역할을

담당한다면 비디오 컨트롤러는 그 내용을 읽어서 화면에 뿌림

비디오 컨트롤러가 프레임 버퍼를 읽는 작업은 매우 빠른 반면

그래픽 프로세서가 프레임 버퍼에 쓰는 작업은 비디오

컨트롤러가 프레임 버퍼를 읽는 속도에 비해 휠씬 느림

Page 18: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Double Buffering

버퍼가 하나일 경우그림(a)같이 오른쪽에서 왼쪽으로 이동하는 애니메이션을만들기 위해서는 화면에 그림(b)를 보여준 후 바로 그림 (d)를그려야 함

만약 프레임 버퍼에 기록하는 속도가 느리다면 프레임 버퍼에아직 그림(c)의 내용이 기록되어 있을 수도 있음

즉, 아직 새로운 내용이 완전히 기록되지 않은 중에 비디오컨트롤러가 프레임 버퍼를 읽어감으로써 불완전한 프레임내용이 출력됨

(a)

(b) (c) (d)

Page 19: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Double Buffering

Front Buffer, Back Buffer각각 영상 하나를 온전히 저장할 수 있는 용량을 가지고 있음

Double Buffer를 사용하면 아래 그림과 같이 비디오 컨트롤러가Front Buffer 내용을 읽고 출력하는 동안 그래픽 프로세서는 BackBuffer에 새로운 내용을 기록

만약 비디오 컨트롤러가 쓰기를 완전히 마치면 비디오컨트롤러는 Back Buffer로 스위칭하여 새로 기록된 내용을읽어감

동시에 그래픽 프로세서는 Front Buffer로 스위칭하여 다시 새로운 내용을기록

Page 20: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Double Buffering

void glutInitDisplayMode(unsigned int mode)GLUT 윈도우의 디스플레이 모드를 초기화한다.mode: 초기화와 관련된 상수 값

void glutSwapBuffers(void)현재 GLUT 윈도우가 Double Buffering 모드로 실행될 때, 이함수는 OpenGL 파이프라인을 모두 실행시킨 후 버퍼 스위칭

ex)//마우스 움직임 콜백 함수 선언

void MyDisplay() { glutSwapBuffers(); //버퍼를 교환한다. }

int main(int argc, char** argv)

{

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); //더블 버퍼를 사용한다.

}

Page 21: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Idle Callback Function

void glutIdleFunc(void (*func)(void))처 리 할 이 벤 트 가 없 을 때 GLUT 가 호 출 하 는콜백함수를 등록시키는 함수

ex>//아이들 콜백 함수 선언

void MyIdle(){}

int main(int argc, char** argv)

{

glutIdleFunc (MyIdle); //아이들 콜백 함수 등록

}

Page 22: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Double Buffering

Double Buffering 예제

Page 23: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Vertex Array

GLuint glFrontFace(GLenum mode)시계 방향으로 감긴 것이 앞면인지 반시계 방향으로 감긴 것이 앞면인지를 설정

기본값 : glFrontFace(GL_CCW); - 반시계 방향을 앞면으로 설정한다.mode

GL_CCW: 반시계 방향

GL_CW: 시계 방향

glFrontFace(GL_CCW);

//반시계방향을 앞면으로

glFrontFace(GL_CW);

//시계방향을 앞면으로

Page 24: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Vertex Array

GLuint glCullFace(GLenum mode)폴리곤의 앞면 혹은 뒷면을 그리기에서 제거할지를 설정한다.

modeGL_FRONT : 앞면을 컬링하고 뒷면을 보여준다.GL_BACK : 뒷면을 컬링하고 앞면을 보여준다.

디폴트 : glCullFace(GL_BACK); - 뒷면을 컬링하고 앞면을 보여준다.

glFrontFace(GL_CCW);

glCullFace(GL_FRONT);

//앞면을 컬링하고 뒷면을 보여준다.

glFrontFace(GL_CCW);

glCullFace(GL_BACK);

//뒷면을 컬링하고 앞면을 보여준다.

Page 25: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Vertex Array

void glEnable/glDisable (GLenum feature)OpenGL 기능(상태)를 enable/disable한다.

featureGL_CULL_FACE : 폴리곤 컬링 기능

디폴트 : glDisable(GL_CULL_FACE); - 컬링 기능을 사용하지 않는다.

glFrontFace(GL_CCW);

glCullFace(GL_BACK);

glEnable(GL_CULL_FACE);

//킬링 사용

//앞면만 그려짐

glFrontFace(GL_CCW);

glCullFace(GL_BACK);

glDisable(GL_CULL_FACE);

//컬링 사용 안 함

//앞, 뒷면 다 그려짐

Page 26: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

void glMatrixMode(GLenum mode)현재 행렬을 설정

modeGL_MODELVIEW : 행렬 연산이 모델 관측 스택에 적용된다.

장면 상에서 물체를 이동할 때 사용한다.GL_PROJECTION : 행렬 연산이 투영 행렬 스택에 적용된다.

클리핑 공간을 정의할 때 사용한다.GL_TEXTURE : 행렬 연산이 텍스쳐 행렬 스택에 적용된다.

텍스쳐 좌표를 조작한다.

void glLoadIdentity()현재 변환 행렬을 주어진 단위 행렬로 바꾼다.

ex>glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

Page 27: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

void glLoadMatrixf(const GLfloat *M)현재 행렬을 주어진 행렬로 설정한다.

void glMultMatrixf(const GLfloat *M)현재 행렬을 주어진 행렬과 곱한다.

*M : 이 배열은 현재 변환 행렬로 설정될 4X4행렬을나타낸다 . 이 배열은 16개의 연속된 값을 가지며 , 열우선순위로 저장되어 있다.

ex> glMatrixMode(GL_MODELVIEW);

float m[] =

{

1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,

0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f

};

glLoadMatrixf(m);

glMultiMatrixf(m);

Page 28: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

void glTranslatef(GLfloat dx, GLfloat dy, GLfloat dz)현재 행렬을 이동 변환 행렬과 곱한다.

dx, dy, dz : x, y, z축 좌표 값

void glScalef(GLfloat sx, GLfloat sy, GLfloat sz)현재 행렬과 크기 변환 행렬을 곱한다.

sx, sy, sz : x, y, z 축에 대한 크기 변환 인수

void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)현재 행렬과 회전 변환 행렬을 곱한다.

angle : 회전각을 도(degree)단위로 나타낸다.x, y, z : 회전축이 되는 방향 벡터의 x, y, z 성분

Page 29: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

기하 변환예제

Page 30: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

void glPushMatrix()현재 행렬을 행렬 스택에 push한다.

void glPopMatrix()현재 행렬을 행렬 스택에서 pop한다.

glPushMatrix(); //Push

GotoBodyCoordinates();

Draw_Body();

glPushMatrix(); //Push

GotoRightShoulderCoordinates();

Draw_RightUpperArm();

glPushMatrix(); //Push

GotoRightElbowCoordinates();

Draw_RightLowerArm ();

glPopMatrix(); //Pop

glPopMatrix(); //Pop

glPushMatrix(); //Push

GotoRightCoxaCoordinates();

Draw_RightUpperLeg();

glPushMatrix(); //Push

GotoRightKneeCoordinates();

Draw_RightLowerLeg();

glPopMatrix(); //Pop

glPopMatrix(); //Pop

glPopMatrix(); //Pop

Page 31: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Geometry Transformation

Push/Pop 행렬 예제

Page 32: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

void glLightfv(GLenum light, GLenum pname, const GLFloat* params)

사용 가능한 8개의 광원 중 하나를 광원 인자로 지정하여 광원의여러 가지 특성을 설정한다.

light어느 광원을 설정할지를 지정한다. (GL_LIGHT0 ~ GL_LIGHT7)

pname이 함수를 호출할 때 사용할 조명 인자를 지정한다.

params설정될 값들의 배열

ex>float ambientLight[] = {1.0f, 1.0f, 1.0f, 1.0f}; // 밝은 흰색 주변광

glLightfv(LIGHT0, GL_AMBIENT, ambientLight); // 주변광을 지정

Page 33: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

glLightfv의 pname 인자에 넣을 수 있는 값

파라미터 명 기본 값 의미

GL_POSITION (0.0, 0.0, 1.0, 0.0) 광원 위치를 지정하는 좌표(x, y, z, w)

GL_SPOT_DIRECTION (0.0, 0.0, -1.0) 스포트라이트의 방향을 지정하는 벡터(x, y, z)

GL_SPOT_CUTOFF 180.0 스포트라이트 절단 각도

GL_SPOT_EXPONENT 0.0 스포트라이트 지수

GL_AMBIENT (0.0, 0.0, 0.0, 0.0) 주변광의 세기

GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) 확산광의 세기

GL_SPECULAR (1.0, 1.0, 1.0, 1.0) 반사광의 세기

GL_CONSTANT_ATTENUNATION 1.0 불변 감쇠 값

GL_LINEAR_ATTENUATION 0.0 선형 감쇠 값

GL_QUADRATIC_ATTENUNATION 0.0 2차 감쇠 값

Page 34: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

광원의 배치GL_POSITION

(x, y, z, w)에서 w = 0이 아니면 (x/w, y/w, z/w)에 위치한 위치성 광원을, w =0이면 좌표(x, y, z)로 빛이 들어오는 방향을 가지는 방향성 광원이 된다.방향성 광원

ex>

GLfloat LightPosition[] = {0.0, 1.0, 0.0, 0.0};

glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);

GLfloat LightPosition[] = {-1.0, 1.0, 0.0, 0.0};

glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);

Page 35: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

스포트라이트스포트라이트를 설정할 때에는 위치성 광원을 설정한 후스포트라이트에 국한된 몇 가지 속성들을 설정해야 한다.

스포트라이트 절단각(GL_SPOT_CUTOFF)스포트라이트 방향(GL_SPOT_DIRECTION)스포트라이트 초점(GL_SPOT_EXPONENT)

초점은 스포트라이트가 원뿔의 축에 어느 정도 집중되는지를 결정

원뿔의 축으로부터 멀어질수록 빛은 점차 감쇠되며, 원뿔의 가장자리에이르면 빛이 사라짐

Page 36: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

재질 설정void glMaterialfv(GLenum face, GLenum pname, GLfloat *param)

조명 계산에 쓰일 현재 재질 속성을 정의한다.face : 객체의 다각형들에 재질이 적용되는 방식 지정

GL_FRONT, GL_BACK, GL_FRONT_AND_BACKpname : 설정하고자 하는 속성

param : 속성에 설정할 값

pname 인자에 사용하는 상수들

상수 의미

GL_AMBIENT 재질의 주변광 색

GL_DIFFUSE 재질의 분산광 색

GL_AMBIENT_AND_DIFFUSE 재질의 주변광과 분산광 색

GL_SPECULAR 재질의 반사광 색

GL_SHININESS 반사율

GL_EMISSION 재질의 방사광 색

Page 37: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

조명 모델들void glLightModeli(GLenum pname, GLint param)void glLightModelfv(GLenum pname, Glfloat* param)

조명 모델설정 함수pname : 조명 모델 인자를 지정한다.param : 주변광의 세기

pname 인자에 사용하는 상수들

상수 의미

GL_LIGHT_MODEL_AMBIENT 장면의 주변광 세기(RGBA) : 기본값은 (0.2, 0.2, 0.2, 1.0)

GL_LIGHT_MODEL_LOCAL_VIWER 시점의 국소 또는 무한 여부 : 기본값은 GL_FALSE(무한)

GL_LIGHT_MODEL_TWO_SIDE 단면 또는 양면 조명 : 기본값은 GL_FALSE (단면)

Page 38: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea Universityhttp://kucg.korea.ac.kr

Lighting

pname 인자GL_LIGHT_MODEL_AMBIENT

특정한 방향 없이 장면 전체에 고르게 비춰지는 주변광을 적용

전역 주변광(Global Ambient Light)

GL_LIGHT_MODEL_LOCAL_VIEWER반사광의 경우 시점의 위치에 따라 하이라이트의 세기가 좌우됨

OpenGL에서는 시점의 위치를 정의된 곳에 그대로 위치시키기도 하지만 시선반대방향에 따라서 무한대로 보내기도 함

GL_TRUE로 설정되면 시점 위치가 물체에 매우 가까운 것으로 간주하여 모든다각형마다 별도의 시점벡터가 계산되고 이렇게 하면 정확한 반사광이 계산되어사실적인 결과를 얻을 수 있으나 계산시간이 오래 걸림

GL_FALSE로 설정되면 시점이 시점벡터 방향으로 무한대 거리에 있는 것으로간주하고 모든 폴리곤에 대해 동일한 시점벡터를 사용하므로 계산시간을 줄일 수 있음

GL_LIGHT_MODEL_TWO_SIDE조명이 다각형의 뒷면에도 적용될 것인지를 결정

Page 39: Graphics - Korea Universitykucg.korea.ac.kr/new/course/2010_2/CNCE340/tutor/06... · 2002. 1. 17. · Mouse Click Callback 함수 void glutMouseFunc(void(*func)(int button, int state,

KUCG

Graphics Lab @ Korea University

Lighting 예제

http://kucg.korea.ac.kr