'Shadows'에 해당되는 글 1건

  1. 2010.03.27 기초 튜토리얼2
2010.03.27 17:20

입문자 튜토리얼 2: Cameras, Lights, and Shadows

튜토리얼 진행중 문제가 발생한다면 Help 포럼 문의하세요.

Contents

*                                  1 미리 알아두어야

*                                  2 소개

*                                  3 시작하기

*                                  4 카메라

*                                          4.1 오우거에서의 카메라

*                                          4.2 카메라 생성

*                                  5 Viewports

*                                          5.1 Ogre Viewports

*                                          5.2 Viewport 생성

*                                  6 조명과 그림자

*                                          6.1 오우거에서 지원하는 그림자 타입들

*                                          6.2 오우거에서 그림자 사용하기

*                                               6.2.1 문제점 해결

*                                          6.3 조명종류

*                                          6.4 조명 생성

*                                  7 해볼만 것들

*                                          7.1 다양한 그림자 타입들

*                                          7.2 감쇄

*                                          7.3 SceneManager::setAmbientLight

*                                          7.4 Viewport 배경색

*                                          7.5 Camera::setFarClipDistance

*                                          7.6 평면

*                                  8 Full Source

 

미리 알아두어야

튜토리얼은 독자가 C++ 프로그래밍이 가능하고 오우거 어플리케이션 설정 컴파일이 가능하다는 가정하에 진행됩니다. 튜토리얼은 첫번째 튜토리얼을 기초로 작성되었으며 독자는 첫번째 튜토리얼을 거쳐왔다고 가정합니다.

 

소개

튜토리얼은 지금까지 배운것에 이어서 처럼 오우거 구성의 몇가지를 소개할 입니다. 빛을 중심으로 어떻게 그것들이 오우거에서 그림자를 생성하는지를 다룰 입니다. 카메라의 아주 기초적인 부분 역시도 다룰것 입니다.

튜토리얼을 진행하면서 독자는 진행단계에 맞추어서 천천히 코드를 스스로 입력하고 결과물을 지켜 필요성이 있습니다. 오우거엔진의 개념을 따라잡는대에는 이것만한 방법이 없습니다! 대충 눈으로 훑고 넘어가지 마세요.

 

시작하기

지난번 튜토리얼처럼 미리 작성된 코드를 기초로 시작할 입니다. TutorialApplication 클래스의 createViewport createCamera 함수를 추가할 입니다. 함수들은 기본 ExampleApplication 클래스 정의되어 있지만 튜토리얼에서는 어떻게 카메라와 뷰포트가 실제로 생성되고 쓰이는지를 살펴볼 입니다.

프로젝트를 생성하고 아래 소스코드를 입력하세요 :

#include "ExampleApplication.h"

 

class TutorialApplication : public ExampleApplication

{

protected:

public:

    TutorialApplication()

    {

    }

 

    ~TutorialApplication()

    {

    }

protected:

    virtual void createCamera(void)

    {

    }

 

    virtual void createViewports(void)

    {

    }

 

    void createScene(void)

    {

        Entity *ent;

        Light *light;

    }

};

 

#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32

#define WIN32_LEAN_AND_MEAN

#include "windows.h"

 

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )

#else

int main(int argc, char **argv)

#endif

{

    // Create application object

    TutorialApplication app;

 

    try {

        app.go();

    } catch( Exception& e ) {

#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32

        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);

#else

        fprintf(stderr, "An exception has occurred: %s\n",

                e.getFullDescription().c_str());

#endif

    }

 

    return 0;

}

만약 오우거SDK Windows 에서 사용한다면 "[OgreSDK_DIRECTORY]\samples\include" 디렉토리 (ExampleApplication.h 파일이 있는곳) include 가능하도록 프로젝트에 추가해 주세요. 만약 오우거엔진 소스를 직접 사용하신다면 [OgreSource_DIRECTORY]\Samples\Common\include" 추가해 주세요. 다음 진행을 위해서 컴파일이 에러없이 되도록 해두세요. 그러나 실행은 하지마세요! 나중에 코드에 추가할 계획입니다. 만약 컴파일에 문제가 생긴다면 Wiki 페이지에서 컴파일러별 설정 정보를 찾아보시고 문제가 지속된다면 Help 포럼에 문의하세요.

 

카메라

 

오우거에서의 카메라

카메라는 생성된 장면을 보는데 사용합니다. 카메라는 SceneNode 처럼 특수 객체로 취급됩니다. 카메라는 setPosition, yaw, roll, pitch 함수들을 가지고 있고 SceneNode attach 수도 있습니다. SceneNode 처럼 카메라의 위치는 부모객체에 상대적인 위치를 가집니다. (누가 생각 해 냈는지 기막힌 아이디어 입니다.) 모든 움직임과 회전은 기본적으로 카메라 - SceneNode 생각하면 됩니다.

 

많은 사람들이 어쩌면 카메라는 한번에 하나만 사용될 것이라고 생각할 지 모르지만 (지금은..) 오우거에서의 카메라는 조금 다른점이 있습니다. 그것은 장면의 일부분을 위해서 카메라 하나만 생성되지는 않고 장면의 다른 부분을 보기위해 다른 카메라가 존재하면서 활성화, 비활성화를 통해서 원하는 장면의 일부분을 화면에 표시할 있습니다. 이 방법 대신에 SceneNode 생성해서 "카메라 거치대" 처럼 사용하는 방법으로도 구현할 수 있습니다. 장면의 일부분을 표시할때 카메라는 알아서 해당되는 SceneNode 위치되어 유저가 보고 싶은 방향을 바라보게 됩니다. 기법은 FrameListener 튜토리얼에서 다시 보게 겁니다.

 

카메라 생성

ExampleApplication 에서 사용되는 카메라 생성 기본함수를 교체해 봅시다.

TutorialApplication::createCamera 멤버 함수로 갑시다. 가장 먼저 해야 일은 카메라 생성입니다. 카메라가 SceneManager 포함되어 있어서 SceneManager 객체를 통해서 생성해야 합니다. 다음 라인을 넣어서 카메라를 생성합니다 :

        // create the camera

        mCamera = mSceneMgr->createCamera("PlayerCam");

명령은 "PlayerCam" 이라는 이름으로 카메라를 생성합니다. 참고로 카메라의 포인터를 따로 관리하지 않아도 SceneManager getCamera 함수를 이용해서 이름을 기준으로 카메라포인터를 리턴받을 있습니다.  

다음으로 해야 일은 카메라의 위치와 어디를 바라 지를 설정 하는 입니다.

원점 주위에 객체를 두게 것이기 때문에 카메라는 적당한 +z 방향에 두고 원점을 바라보게 입니다. 방금 코드 다음에 다음 라인을 추가하세요 :

        // set its position, direction 

        mCamera->setPosition(Vector3(0,10,500));

        mCamera->lookAt(Vector3(0,0,0));

lookAt 함수는 센스쟁이입니다. 카메라가 어디에 있던지 yaw, rotate, pitch 과정을 거치지 않고도 유저가 원하는 방향으로 바라보게 해줍니다. SceneNode 역시 함수를 가지고 있어서 Entity 바라보는 방향을 다양한 상황에서 손쉽게 원하는 방향으로 향하도록 있습니다.

마지막으로 가까운 클리핑 거리를 5유닛 으로 설정합니다. 카메라에서 클리핑 거리는 얼마나 가깝거나 멀어야 보이지 않는지를 의미합니다. 근접 클리핑 거리는 Entity 너무 가깝게 있을때 가로막는 객체를 꿰뚫어서 화면을 있도록 줍니다. 어떠한 상황에서 객체가 너무 가까이 있으면 화면을 꽉차게 가로막아서 화면의 아주 작은부분을 제외하고는 아무것도 없게 됩니다. 이것 말고도 원거리 클리핑거리도 설정 가능합니다. 수치는 일정한 거리를 넘어선 물체를 렌더링엔진이 그리는것을 중단시킵니다. 만약 화면상에서 매우 거리에 걸쳐서 많은양의 객체를 그려야 경우라면 원거리 클리핑 수치조절은 프레임성능을 올리는데 중요하게 쓰여질 입니다. 근접 클리핑 거리를 설정하기위해 다음 라인을 추가하세요 :

        mCamera->setNearClipDistance(5);

원거리 클리핑 영역 설정은 간단하게 setFarClipDistance 호출하면 됩니다(보통 스텐실 쉐도우와 같이 쓰면 안되지만 여기 튜토리얼에서는 쓰입니다).
Trackback 0 : Comment 0

기초 튜토리얼 2-2

Ogre3D 삽질란/Basic Tutorial 2 2008/11/08 17:12

 

Viewports

 

Ogre Viewports

여러개의 카메라를 다룰경우 뷰포트 클래스 개념은 무척이나 유용하게 쓰일 입니다. 이야기를 지금 꺼내는 이유는 오우거가 장면을 그릴때 사용할 카메라를 어떻게 선택하는지를 이해하는것이 중요하기 때문이죠. 한번에 여러개의 SceneManager 실행하는것이 가능합니다. 하나의 스크린을 여러개의 영역으로 분할해서 각각의 카메라들이 각각의 영역을 그리는것 (예를 들면 콘솔게임에서 하나의 화면에서 2인플레이를 하는것) 역시 가능합니다. 이러한 작업들이 가능하지만 세부적인 방법은 Advanced 튜토리얼에서 다루게 입니다.

오우거가 어떻게 장면을 그리는지를 이해하려면 오우거의 3가지 구성요소를 알아야 합니다 : Camera, SceneManager 그리고 RenderWindow 입니다. RenderWindow   다루지 않았습니다만 간단하게 말하면 모든것이 출력되는 윈도우라 생각하시면 됩니다. RenderWindow 에게 어떤 카메라가 화면에 출력할지를 알려줘야 하며 출력될 화면의 영역도 알려줘야 합니다. RenderWindow 에게 알려주는 카메라 출력 영역은 유저의 뷰포트 입니다. 일반적인 오우거 사용에 있어서는 보통 하나의 카메라를 생성하고 화면 전체를 사용하는 RenderWindow 등록하므로 하나의 뷰포트 객체를 가지게 됩니다.

이제 뷰포트를 생성하기위해 카메라를 어떻게 등록하는지를 다뤄 봅시다. 다음 그려질 장면의 배경색을 설정하기위한 뷰포트 오브젝트를 사용할 있습니다.

 

Viewport 생성

ExampleApplication 뷰포트 생성부분을 재정의 하기위해 TutorialApplication::createViewports 함수로 갑시다. 뷰포트를 만들기 위해서는 단순히 RenderWindow addViewport 함수를 호출하고 어떤 카메라가 사용되는지만 알려주면 됩니다. ExampleApplication 클래스에는 이미 mWindow 클래스가 RenderWindow 함께 자리잡고 있으므로 그냥 다음 라인을 추가하세요 :

        // Create one viewport, entire window

        Viewport* vp = mWindow->addViewport(mCamera);

이제 뷰포트를 만들었습니다만 이걸로 할수 있을까요? 대답 : 별로 할게 없습니다. 가장 중요한건 setBackgroundColour 함수로 배경색을 자유롭게 정할 있다는 입니다. 조명 튜토리얼에서 했던 처럼 배경색을 검정으로 지정해 봅시다 :

        vp->setBackgroundColour(ColourValue(0,0,0));

ColourValue red, green 그리고 blue 색상값 가지는데 0 1 사이의 값을 취합니다. 마지막으로 해야할게 있는데 바로 카메라의 화면 종횡비율 설정입니다. 만약 정상적인 전체화면 뷰포트의 비율과 다르게 설정하면 장면이 이상하게 보일 입니다. 초기값 종횡비율을 사용하게 것이지만 일단 한번 설정 봅시다 :  

        // Alter the camera aspect ratio to match the viewport

        mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));   

긴단한 뷰포트 클래스의 사용법을 끝냈습니다. 비록 화면에 나오는게 아무것도 없지만 적어도 어플리케이션을 컴파일 하고 실행할 있게 되었습니다(ESC 누르면 종료). 다음 과정으로 넘어가기전에 실행이 되는지를 확인하세요.

 

조명과 그림자

 

오우거에서 지원하는 그림자 타입들

오우거는 현재 3가지 종류의 그림자를 지원합니다 :

사용자 삽입 이미지


1.    Modulative Texture Shadows (SHADOWTYPE_TEXTURE_MODULATIVE) - 3가지 방식중에서 가장 적은 계산량을 요구합니다. 흑백 방식의 그림자를 생성한 다음에 장면에 적용합니다.

2.    Modulative Stencil Shadows (SHADOWTYPE_STENCIL_MODULATIVE) - 기법은 불투명 객체들이 화면에 그려지고 다음에 그림자가 있어야 자리는 따로 다시 계산하여 최종적으로 출력합니다. Additive Stencil Shadows 만큼 부하가 걸리지는 않지만 만큼 세밀한 그림자 출력을 해주지는 않습니다.

3.    Additive Stencil Shadows (SHADOWTYPE_STENCIL_ADDITIVE) - 기법은 각각의 조명이 따로 화면을 그리는 과정으로 처리 됩니다. 하나의 조명은 한번의 전체렌더링을 그리는 만큼의 처리량을 필요로 하기때문에 그래픽카드에 많은 부하가 걸리게 됩니다.

Soft shadow 그림자는 엔진의 기본기능으로는 제공하지 않습니다. 만약 Soft shadow 사용하시고 싶으시면 사용자가 따로 vertex fragment 코드를 작성해야 합니다. 여기서는 이것에 대한 간단한 소개만 것입니다. 오우거 메뉴얼을 참고하시면 오우거에서의 그림자들에 대한 간략한 사용법이 모두 설명되어 있습니다.

 

오우거에서 그림자 사용하기

오우거에서 그림자를 쓰는것은 비교적 쉽습니다. SceneManager 클래스는 어떠한 그림자를 사용할지를 설정해 주는 setShadowTechnique 멤버 함수를 가지고 있습니다. 다음에 언제든지 Entity 만들면 setCastShadows 함수를 호출하는것으로 그림자를 생성하거나 숨길 있습니다.

이제 주변광을 완전한 어둠으로 설정하고 사용하게 그림자를 선택합니다. TutorialApplication::createScene 함수로 가서 다음 코드를 입력해 주세요 :

        mSceneMgr->setAmbientLight(ColourValue(0, 0, 0));

        mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);

이제 SceneManager additive stencil shadows 사용하게 됩니다. 어서 객체를 화면에 띄워놓고 그림자를 발생시켜 봅시다 :

        Entity *ent = mSceneMgr->createEntity("Ninja", "ninja.mesh");

        ent->setCastShadows(true);

        mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

설명하자면 ExampleApplication 클래스는 미리 ninja.mesh 메모리에 로드시켜놓았습니다. 그것도 좋지만 우리는 닌자가 있을만한 뭔가가 필요합니다(그림자가 뿌려질 뭔가를 말이죠). 그렇기에 우리는 닌자가 있을만한 간단한 평면을 생성할 입니다. MeshManager 기반으로 진행되는 튜토리얼이 된다는 의미는 아니지만 평면을 생성하기위해서 최소한의 기본은 사용할 입니다. 가장먼저 평면 객체 자체를 정의하고 원점으로부터 떨어진 거리, (Normal)법선벡터를 설정해야 합니다. 평면을 지형의 일부분으로 사용할 있으며, 경우 원점으로부터 어느정도 떨어져서 위치하도록 해야 필요도 있습니다. 우리는 +y 방향을 향한(앞면이 위로 향한) 평면이 필요하고 원점에 위치하게 입니다 :

       Plane plane(Vector3::UNIT_Y, 0);

어플리케이션에서 있도록 평면을 등록합시다. MeshManager 클래스는 어플리케이션에서 읽어드린 모든 메쉬들을 관리합니다(robot.mesh ninja.mesh 같이 읽어들였던 ). createPlane 멤버함수는 평면의 정의와 매개변수로 부터 메쉬를 생성합니다. 평면을 쓰기위해 등록합니다 :

       MeshManager::getSingleton().createPlane("ground",

           ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,

           1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);

          

다시 언급하지만, MeshManager 어떻게 사용되는지를 아직은 알려고 하지 마세요 ( 매개변수들이 정확히 하는지 알고 싶다면 API 레퍼런스를 참고하세요). 간단하게 보자면 1500 x 1500 크기의 "ground" 라고 불리는 평면메쉬를 등록했습니다. 이제 메쉬로 Entity 만들고 장면에 올려봅시다 :

       ent = mSceneMgr->createEntity("GroundEntity", "ground");

       mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

깔끔하죠? "ground" 위해서 해야할게 2 남았습니다. 첫째는 SceneManager에게 그림자가 표시될 영역이기 때문에 지면자체가 그림자를 생성할 필요가 없다고 알리는 입니다. 두번째는 텍스쳐를 입히는 입니다. 우리가 쓰는 로봇과 닌자의 메쉬는 재질 스크립트가 자체적으로 이미 설정되어 있습니다. 우리가 수동으로 "ground" 메쉬를 생성할 어떤 텍스쳐가 사용될지는 설정하지 않았습니다. 이것에는 오우거 샘플에 포함된 "Examples/Rockwall" 이름의 재질 스크립트를 사용 것입니다 :

       ent->setMaterialName("Examples/Rockwall");

       ent->setCastShadows(false);

이제 지면과 닌자를 장면에 올려놨으니 컴파일하고 실행시켜 봅시다. , 거기 멋진 닌자가.. 안보입니다! 어떻게 된거죠? 이전 튜토리얼에서는 로봇을 넣고 보였습니다. 닌자가 보이지 않는 이유는 주변광을 완전깜깜한 어둠으로 설정했기 때문입니다. .. 조명을 추가하고 뭐가 어찌 돌아가는지 봅시다.

 

문제점 해결

몇몇 분들께서 부분을 진행함에 있어서 code::blocks 에서 GCC 사용할 경우 문제점이 있다고 알려줬습니다. 이런 비슷한 에러 메세지를 발견 하신다면 :  

variable 'vtable for Ogre::MeshPtr' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.

Linker 옵션에 다음줄을 추가해 주세요 :

-Wl,--enable-runtime-pseudo-reloc

codeblocks::ide 사용한다면 project name -> build options -> linker 옵션으로 가서 설정하세요.

 

조명 종류

오우거는 3가지 종류의 조명을 제공합니다.

1.    Point (LT_POINT) - 한개 지점에서 사방으로 빛이 퍼져 나옵니다.

2.    Spotlight (LT_SPOTLIGHT) - spotlight 정확하게 손전등처럼 동작합니다. 빛이 나가는 점이 있고 가리키는 방향쪽으로 빛이 진행됩니다. 안쪽과 바깥쪽의 빛의 퍼짐 각도도 절정할 있습니다(손전등은 주변부 빛보다 중심쪽이 밝다는 사실을 아십니까?)

3.    Directional (LT_DIRECTIONAL) - 방향성을 가진 조명은 한개방향으로 빛이 진행되면서 부딛히는 모든것을 시뮬레이트 줍니다. 예를 들면 밤의 배경에서 달빛을 구현하고 싶습니다. 옅은 주변광으로 비슷하게 구현할 있을지 모르겠지만 달빛이 모든 사물을 똑같이 비춘다는 (해도 똑같습니다) 에서는 비현실 적입니다. 한가지 방법은 달이 빛나는 지점과 방향성을 가진 조명을 설정하는 입니다.

조명이 어떻게 보일지 설정하는데에는 무척이나 넓은 변수가 작용합니다. 가장 중요한 2가지 조명속성으로는 산란(diffuse) 정반사(specular) 색상입니다. 각각의 재질은 반사될때 어느정도의 산란광 정반사광 수치를 가지는지 정의되는데 추후 튜토리얼에서 어떻게 제어하는지를 다룰 예정입니다.

 

조명 생성

조명생성을 위해서는 SceneManager createLight 멤버함수에 조명이름을 제공하여 만드는데 Entity Camera 생성하는것과 배우 유사합니다. 조명생성후 위치를 설정하는데 수동으로 할것인지 SceneNode 붙여서 이동하는데 유리하게 할지를 선택할 있습니다. 카메라 오브젝트와는 다르게 조명은 setPosition setDirection 가능합니다(게다가 translate, pitch, yaw, roll 등과 같은 움직임과 관련된 함수들도 없습니다). 그래서 만약 정적인 조명을 만들어야 한다면 setPosition 멤버함수를 호출하면 됩니다. 만약 움직이는 조명이 필요하다면(캐릭터를 따라다니는 조명같은) setPosition 호출 대신에 SceneNode 붙여야 합니다.

기본적인 point 조명을 만들어 봅시다. 첫번째로 일은 조명을 만들고, 타입을 설정하고, 위치를 설정하는 입니다 :

       Light *light = mSceneMgr->createLight("Light1");

       light->setType(Light::LT_POINT);

       light->setPosition(Vector3(0, 150, 250));

산란광과 반사광을 설정할 있는 조명이 만들어 졌습니다. 빨간 조명으로 만듭니다 :

       light->setDiffuseColour(1.0, 0.0, 0.0);

       light->setSpecularColour(1.0, 0.0, 0.0);

이제 컴파일후 실행시켜 봅시다. 해냈습니다! 이제 닌자와 그림자를 있습니다. 닌자의 정면으로 카메라를 옮겨서 전체적인 모습을 보세요. 관심있게 보셔야 점은 광원을 없다는 입니다. 빛이 생성하는 것은 보이지만 자체는 보이지 않습니다. 많은 오우거 튜토리얼에서는 빛이 어디에서 비추고 있는지를 보여주기 위해 간단한 Entity 추가합니다. 만약 조명과 관련해서 어려움이 발생한다면 조명이 정확하게 어디에 있는지를 확인할 있도록 뭔가를 생성하는것을 고려할 필요성이 있습니다.

다음으로 방향성을 가진 조명을 시도해 봅시다. 닌자의 정면이 정말 새까맣죠? 희미한 노란색 조명을 정면방향에서 비춰 봅시다. 조명을 만들고 색상은 point 조명에서 했던방법 처럼 설정합니다 :

       light = mSceneMgr->createLight("Light3");

       light->setType(Light::LT_DIRECTIONAL);

       light->setDiffuseColour(ColourValue(.25, .25, 0));

       light->setSpecularColour(ColourValue(.25, .25, 0));

방향성을 가진 조명은 거리와는 관계없이 동일하게 적용되므로 위치를 설정할 필요없이 방향만 설정해 주면 됩니다. 지금 생성하는 조명은 +z 에서 -y 방향으로 비추게 것입니다 (닌자의 45 -정면 방향에서 빛이 내려온다고 생각하시면 됩니다) :

       light->setDirection(Vector3( 0, -1, 1 ));

컴파일하고 실행시켜 봅시다. 화면상 2개의 그림자를 있습니다. 방향성 조명이 희마한 만큼 그림자도 희미합니다. 마지막으로 살펴볼 조명종류는 spotlight 입니다. 이제 spotlight 생성해 봅시다 :

       light = mSceneMgr->createLight("Light2");

       light->setType(Light::LT_SPOTLIGHT);

       light->setDiffuseColour(0, 0, 1.0);

       light->setSpecularColour(0, 0, 1.0);

spotlight 빛을 방향과 위치 둘다 설정해야 합니다. 닌자의 오른쪽 어께위로 있는 spotlight 생성하고 닌자를 향해서 빛을 발산할 입니다 :

       light->setDirection(-1, -1, 0);

       light->setPosition(Vector3(300, 300, 0));

Spotlight 광선이 얼마나 넓게 퍼질지도 설정할 있습니다. 손전등을 잠시 떠올려 보세요. 광선의 중심은 주변을 감싸는 빛보다 밝습니다. 광선의 넓이요소들을 setSpotlightRange 멤버함수를 호출하여 설정할 있습니다 :

       light->setSpotlightRange(Degree(35), Degree(50));

컴파일하고 실행시켜 보세요. 보라색 닌자... 살벌하군요!

Trackback 0 : Comment 0

기초 튜토리얼 2-3 (마지막)

Ogre3D 삽질란/Basic Tutorial 2 2008/11/08 17:10

해볼만 것들

 

다양한 그림자 타입들

데모에서는 SHADOWTYPE_STENCIL_ADDITIVE 방식의 그림자만 설정했습니다. 다른 2가지 종류의 그림자 타입도 설정해 보고 어떻게 달라지는지를 살펴보세요. 게다가 찾아보시면 소개되지 않은 그림자관련 SceneManager 함수들도 많이 있습니다. 다양한 방법들을 시도해 보시고 어떤 결과가 출력되는지 살펴보세요.

 

감쇠

조명은 setAttenuation 함수로 빛이 감쇠하되면서 얼마나 멀리까지 뻗어 나갈 있게 설정할 있습니다. point 조명을 호출하는 부분에 감쇠수치를 다르게 해서 설정해 보세요. 빛에 어떤 영향을 줄까요?

 

SceneManager::setAmbientLight

mSceneMgr setAmbientLight 함수를 시험해 보세요.

 

Viewport 배경색

createViewports ColourValue 초기치를 바꿔보세요. 상황에서는 검은색이 아닌 다른색으로 하는건 적절한 선택이 아니지만 어떻게 바뀌는지를 알아두시면 도움이 되실 입니다.

 

Camera::setFarClipDistance

createCamera 에서 근접 클리핑 거리를 설정했었습니다. setFarClipDistance 함수를 수치값 500 으로 호출하는 부분을 추가해 보고 닌자가 보이지 않을때까지 이동해 보시면서 stencil shadows 변하는것을 지켜보세요. 뭔가 타이밍이 맞지 않음을 보셨습니까?

참고 : 현상발생을 위해서는 mSceneMgr->setShadowUseInfiniteFarPlane(false) 설정해 주셔야 하며 뭔가 어색한 그림자를 보실 있을겁니다.

 

평면

이번 튜토리얼에서는 평면에 대해서 많은부분을 다루지 못했습니다(이번 튜토리얼의 주제가 아니었기 때문이죠). 나중에 있을 튜토리얼에서 주제에 대해서 다시 다룰 예정이지만 지금 createPlane 함수와 관련된 정보를 찾아보시고 직접 매개변수를 입력해 보시고 다뤄보시길 권합니다.

출처 : http://begin.pe.kr/category/Ogre3D%20삽질란/Basic%20Tutorial%202

신고
Posted by 우엉 여왕님!! ghostkyow

티스토리 툴바