<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

Similar documents
슬라이드 1

슬라이드 1

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

슬라이드 1

슬라이드 1

Microsoft PowerPoint - lecture16-ch6

슬라이드 1

Microsoft PowerPoint - lecture15-ch6.ppt

<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

Łø·ŸÕ=¤ ¬ ÇX±xÒ¸ 06 - Èpº– 1

슬라이드 1

(Microsoft PowerPoint - \301\24611\260\255 - \276\326\264\317\270\336\300\314\274\307)

슬라이드 1

슬라이드 1

슬라이드 1

PowerPoint Presentation

유니티 변수-함수.key

3D MAX + WEEK 9 Hansung Univ. Interior Design

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

<4D F736F F F696E74202D B30395FBAEDB7BBB5F95FBDBAC5D9BDC7B9F6C6DB5FB1D7B8B2C0DA2E >

PowerPoint 프레젠테이션

슬라이드 1

Open GL

<353120C0CCB8E9C0E72D4E504320C0CEB0F820C1F6B4C9C0BB20C0A7C7D120B9ABB8AEC1FEB1E220B1B8C7F62E687770>

Microsoft PowerPoint - 13prac.pptx

DBPIA-NURIMEDIA

Microsoft PowerPoint - 07-Data Manipulation.pptx

Microsoft Word - cg07-midterm.doc

PowerPoint 프레젠테이션

Microsoft PowerPoint - lecture13-ch6.ppt [호환 모드]

Microsoft Word - cg12-midterm-answer

PowerPoint 프레젠테이션

(Microsoft PowerPoint - lecture13-ch6.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - Week04_DirectX9 프로그래밍의 기초2.pptx

Chap 6: Graphs

(Microsoft PowerPoint - CNVZNGWAIYSE.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - C++ 5 .pptx

03_queue

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

PowerPoint 프레젠테이션

ThisJava ..

K&R2 Reference Manual 번역본

슬라이드 1

C++ Programming

chap x: G입력

PowerPoint 프레젠테이션

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Microsoft PowerPoint - Lec06.ppt [호환 모드]

Microsoft PowerPoint - Java7.pptx

chap 5: Trees

16<C624><D22C><ACFC><D0D0> <ACE0><B4F1><BB3C><B9AC><2160>_<BCF8><CC45>.pdf

PowerPoint Presentation

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

JUNIT 실습및발표

TEST BANK & SOLUTION

소프트웨어공학개론 강의 11: UML 코드매핑 최은만동국대학교컴퓨터공학과

adfasdfasfdasfasfadf

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

UI TASK & KEY EVENT

Microsoft Word - cg07-final.doc

Microsoft PowerPoint - lecture12-ch5.ppt [호환 모드]

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

소성해석

Microsoft PowerPoint - 04-UDP Programming.ppt

쉽게 풀어쓴 C 프로그래밍

2002 Game White paper 2002 Game White paper

04_오픈지엘API.key

Microsoft PowerPoint - lec2.ppt

JAVA PROGRAMMING 실습 08.다형성

슬라이드 1

PowerPoint Presentation

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

JAVA PROGRAMMING 실습 02. 표준 입출력

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - GameProgramming23-PixelShader.ppt

서피스셰이더프로그램 셰이더개발을쉽게! Thursday, April 12, 12

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - 04-Model Class.pptx

Python과 함께 배우는 신호 해석 제 5 강. 복소수 연산 및 Python을 이용한 복소수 연산 (제 2 장. 복소수 기초)

02장.배열과 클래스

<C3D6C0E7C3B528BAB8B5B5C0DAB7E1292D322E687770>

Particle Image Velocimetry Chapter 1: Introduction

Microsoft PowerPoint - chap02.ppt

Microsoft PowerPoint - ch02-1.ppt


<4D F736F F F696E74202D204347C3E2BCAEBCF6BEF D325FC4C4C7BBC5CDB1D7B7A1C7C8BDBA20B1E2BABBBFE4BCD22E >

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

C프로-3장c03逞풚

PowerPoint Template

Microsoft PowerPoint - lecture11-ch4

Transcription:

게임엔진 제 7 강광원과그림자 이대현교수 한국산업기술대학교게임공학과

학습내용 광원의종류 평면메쉬의생성방법 광원의구현 그림자의종류와구현

광원의종류 : 주변광원 주변광원 (Ambient Light) 동일한밝기의빛이장면안의모든물체의표면에서일정하게반사되는것. 공간안에존재하는빛의평균값 이론적인광원

광원의종류 : 지향광원 지향광원 (Directional Light) 한방향으로무한히뻗어나가는빛. 빛이물체면을향하여일정한방향으로진행. 거리에상관없이특정한한방향 ( 벡터 ) 에대해서빛의세기가일정하게주어진다 방향이중요 태양을흉내낼때주로쓰임. OGRE 엔진 : LT_DIRECTIONAL

광원의종류 : 점광원 점광원 (Point Light) 공간안의한점에서모든방향으로동일하게뻗어나가는빛. 백열전구를모델링. 광원과물체표면과의거리의제곱에비례하여밝기가약해짐 ( 감쇄 : attenuation) 거리가중요 OGRE 엔진 : LT_POINT

광원의종류 : 점적광원 점적광원 (Spot Light) 정해진위치와범위만비추는광원. 일종의점광원이지만, 모든방향으로만퍼지는것이아니고, 특정방향으로지정된각도만큼빛이퍼져나감. 무대조명을모델링. 거리에따라서빛의세기가약해짐. OGRE 엔진 : LT_SPOTLIGHT

이번강의구현내용 : 어둠속의닌자

Y X Z

Y X Z

Y X Z

Y X Z

실습 Light 광원및그림자표현

PlayState.cpp void PlayState::enter() { 중략 mscenemgr->setambientlight(colourvalue(1.0f, 1.0f, 1.0f)); 실습 Plane plane( Vector3::UNIT_Y, 0 ); MeshManager::getSingleton().createPlane( "ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 500,500, 1,1, true,1,5,5, Vector3::UNIT_Z ); Entity* groundentity = mscenemgr->createentity( "GroundEntity", "ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); ninjaentity = mscenemgr->createentity("ninja#1", "ninja.mesh"); ninjanode = mscenemgr->getrootscenenode()->createchildscenenode(); ninjanode->attachobject(ninjaentity); }

실행결과

평면메쉬의생성 생성방법 먼저평면을생성하고 (Plane 클래스사용 ), 그리고이것을메쉬로변환한다 (MeshManager 클래스사용 ) 평면의생성 두개의정보가필요 : 평면의법선벡터 (normal vector) 및평면과원점의거리 Plane plane(vector3::unit_y, 0); Y X Z

메쉬의생성 MeshManager 클래스 프로그램에서로드된모든메쉬들을관리하는클래스 메쉬이름. MeshManager::getSingleton().createPlane("ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 1500,1500,1,1,true,1,5,5,Vector3::UNIT_Z); 평면정보. 너비 : 1500 높이 : 1500

엔터티와장면노드의생성 앞에서만든메쉬의이름. Entity* groundentity = mscenemgr->createentity( "GroundEntity", "ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); 장면노드의생성 장면노드에엔터티배치.

텍스쳐입히기 setmaterialname() 함수사용 Entity* groundentity = mscenemgr->createentity( "GroundEntity", "ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); groundentity->setmaterialname( Examples/Rockwall ); material Examples/Rockwall { technique { pass { texture_unit { texture rockwall.tga } } } } lecturepack.zip 내의 Examples.material 에위치. Rockwall.tga 파일을이미지로사용.

텍스쳐가입혀진평면

PlayState.cpp 광원추가 void PlayState::enter() { 중략 mscenemgr->setambientlight(colourvalue(0.0f, 0.0f, 0.0f)); 실습 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 0, -0.5f, -1 ) ); mlightd->setvisible(false); mlightp = mscenemgr->createlight("lightp"); mlightp->settype( Light::LT_POINT ); mlightp->setposition( Vector3(0, 150, -50) ); mlightp->setvisible(false); mlights = mscenemgr->createlight("lights"); mlights->settype( Light::LT_SPOTLIGHT ); mlights->setdirection( 0, -1, 0 ); mlights->setposition( Vector3( 0, 300, 0 ) ); mlights->setspotlightrange( Degree(20), Degree(50) ); mlights->setvisible(false); 후략

bool PlayState::frameStarted(GameManager* game, const FrameEvent& evt) { ninjanode->yaw(degree(1.0f)); 실습 game->captureinput(); if (game->iskeydown(kc_a)) { static float a = 0.0f; a = (a > 0.99f)? 0.0f : a + 0.01f; mscenemgr->setambientlight(colourvalue(a, a, a)); } else if (game->iskeydown(kc_d)) { mlightd->setvisible(!mlightd->getvisible()); } else if (game->iskeydown(kc_p)) { mlightp->setvisible(!mlightp->getvisible()); } else if (game->iskeydown(kc_s)) { mlights->setvisible(!mlights->getvisible()); } return!game->iskeydown(kc_escape); }

실행결과 : 종류별광원의실험

광원의생성 Light 클래스 SceneManager::createLight(): 광원생성 Light::setType(): 광원종류설정 Light::setPosition(): 광원의위치설정 Light::setDirection(): 광원의방향설정 광원객체를장면노드에소속시키면, 광원을이동하는것이가능함. 캐릭터를따라다니는광원을구현할수있슴. 광원의생성 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 0.0f, -0.5f, -1.0f ) ); mlightd->setvisible(false); 광원의종류를설정. 지향광원으로설정함. 광원 ON/OFF 광원의방향설정.

점광원및점적광원의생성및설정 mlightp = mscenemgr->createlight("lightp"); mlightp->settype( Light::LT_POINT ); mlightp->setposition( Vector3(0, 0, -300) ); mlightp->setvisible(false); 점광원의위치결정. mlights = mscenemgr->createlight("lights"); mlights->settype( Light::LT_SPOTLIGHT ); mlights->setdirection( 0, -1, 0 ); mlights->setposition( Vector3( 0, 300, 0 ) ); mlights->setspotlightrange( Degree(20), Degree(50) ); mlights->setvisible(false); 점적광원의확산각도 ( 안쪽각도, 바깥쪽각도 ) 설정. 안쪽각도는 Direct3D 에만적용가능. OpenGL 에서는 0 도로간주.

그림자 실세계에서발생하는현상 공간감을높이는점에서매우중요함.

그림자 실세계에서발생하는현상 공간감을높이는점에서매우중요함.

Hard Shadow vs. Soft Shadow

근사그림자 (Approximate Shadow) 사람은그림자의대략적인모습을인식할뿐, 정확한모습에는낮은인지도를보임 이를이용하여조명과물체간의공간적위치를고려하여직접간단한그림자를추가. 사실성은떨어지지만, 별도의연산이필요없기때문에,

지면그림자 (Ground Shadow) 지면그림자 (Ground Plane Shadows) 투상그림자 (Projection Shadows) 바닥에투상된그림자만을고려. 물체면간의그림자는고려치않음

셰도우맵 (Shadow Map) 화소단위의영상공간알고리즘 1. 광원기준가장가까운물체면과의거리 (A) 를셰도우지 - 버퍼에저장 2. 은면제거를위해시점기준가장가까운물체면화소를구함 3. 해당화소물체면으로부터광원 (B) 까지의거리를구함. 4. B 가 A 보다크면해당화소는그림자영역내부에존재함.

그림자부피 (Shadow Volume) 가시부피와그림자부피가중첩되는곳이그림자영향권 보통 stencil buffer를사용하여구현 Stencil shadow라고도부름

스텐실버퍼생성알고리즘 다수개의다각형에의한그림자 그림자부피안으로들어갈때 + 1, 나갈때 -1 결과적인카운트값이 0보다크면그림자색

PlayState.cpp 그림자추가 void PlayState::enter() { 중략 mscenemgr->setambientlight(colourvalue(0.0f, 0.0f, 0.0f)); 실습 mscenemgr->setshadowtechnique(shadowtype_stencil_additive); 중략 Entity* groundentity = mscenemgr->createentity( "GroundEntity", "ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); groundentity->setmaterialname("examples/rockwall"); groundentity->setcastshadows(false); ninjaentity = mscenemgr->createentity("ninja#1", "ninja.mesh"); ninjanode = mscenemgr->getrootscenenode()->createchildscenenode(); ninjanode->attachobject(ninjaentity); ninjaentity->setcastshadows(true); 후략

점광원에의한그림자

점적광원에의한그림자

지향광원에의한그림자

오우거엔진의그림자설정 그림자생성기법설정 void Ogre::SceneManager::setShadowTechnique ( ShadowTechnique technique ) SHADOWTYPE_STENCIL_ADDITIVE SHADOWTYPE_STENCIL_MODULATIVE SHADOWTYPE_TEXTURE_MODULATIVE mscenemgr->setshadowtechnique(shadowtype_stencil_additive); 그림자생성기법을스텐실그림자로설정

그림자표시여부결정 void Ogre::MovableObject::setCastShadows( bool enabled ) 기본값은 false: 그림자를표시하지않음. Entity* groundentity = mscenemgr->createentity( "GroundEntity", "ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); groundentity->setmaterialname("examples/rockwall"); groundentity->setcastshadows(false); 평면은그림자를표시하지않도록설정. ninjaentity = mscenemgr->createentity("ninja#1", "ninja.mesh"); ninjanode = mscenemgr->getrootscenenode()->createchildscenenode(); ninjanode->attachobject(ninjaentity); ninjaentity->setcastshadows(true); 닌자는그림자를표시하도록설정.

Shadow Volume 과 Shadow Map 의비교 Shadow Volume 깨끗한실루엣표현가능 기하정보가증가 ( 속도저하 ) SHADOWTYPE_STENCIL_ADDITIVE SHADOWTYPE_STENCIL_MODULATIVE Shadow Map 빠르고유연함 많은게임에서사용되고있음 SHADOWTYPE_TEXTURE_MODULATIVE Aliasing: 그림자외곽에서계단현상 여러개선알고리즘이있음 PCF (Percentage Closer Filtering) LiSPSM (Light-Space Perspective Shadow Map)