cmake 옵션에서 

OGRE_CONFIG_MEMTRACK_DEBUG
OGRE_CONFIG_MEMTRACK_RELEASE

2개의 플래그를 키면 메모리 트래킹이된다.
각가 디버그용과 릴리즈용 플래그이다.

이미 cmake는 한 상태이면 간단히 OgreBuildSettings.h 파일에서 

OGRE_MEMORY_TRACKER_DEBUG_MODE
OGRE_MEMORY_TRACKER_RELEASE_MODE

를 각가 1로 설정해도 된다. 

 
블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

mSceneMgr->setShadowTechnique() 함수로 그림자를 설정하는 경우 스크롤이 먹지 않는다.

mSceneMgr->setShadowTechnique() 함수로 그림자를 설정해도
메터리얼에서 scroll_anim으로 설정한 스크롤은 먹는다. 

도대체 차이가 뭐가 크다고 안되는 거야.

 
블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

1. 쉐이더 코드 작성(GrayScale.cg)

sampler RT : register(s0);

void calculateMaterialColorInDirectionalLight(	float4 position			: POSITION,
								float4 normal			: NORMAL,
								float2 uv				: TEXCOORD0,
						  
								out float4 oPosition	: POSITION,
								out float3 oNormal		: COLOR,
								out float2 oUv			: TEXCOORD0,

								uniform float4x4	worldViewProj,
								uniform float4x4	world,
								uniform float3		ambient,
								uniform float		diffusePower,
								uniform float3		diffuse,
								uniform float3		lightDirection, 
								uniform float3		lightColor
								)
{
	oPosition = mul(worldViewProj, position);
	oUv = uv;
	oNormal = (normalize(mul(world, normal))).xyz;
	oNormal = diffuse * diffusePower * saturate(dot(oNormal, normalize(lightDirection)));
	oNormal = lightColor * (ambient + oNormal);
}

void calculateGrayScaleInMaterialColor(	float3 normal			: COLOR,
							float2 uv				: TEXCOORD0,
										
							out float4 oColor		: COLOR,
										
							uniform sampler2D	RT : register(s0),
							uniform float		grayRatio
							)
{
	float3 tex_col = tex2D(RT, uv).rgb * normal;
	float3 greyscale = tex_col * (1 - grayRatio) + dot(tex_col, float3(0.3, 0.59, 0.11)) * grayRatio;
	oColor = float4(greyscale, 1.0);
}

 - 출력 변수에는 out으로 선언한다.
 - C 코드에서 입력할 데이터들은 uniform으로 선언한다.

2. 메터리얼 작성(GrayScale.material)

vertex_program ColorConvertor/GrayScale_vp cg
{
	source GrayScale.cg
	entry_point calculateMaterialColorInDirectionalLight
	profiles vs_1_1 arbvp1

	default_params
	{
		param_named_auto worldViewProj worldviewproj_matrix
		param_named_auto world world_matrix

		param_named ambient float3 0.2 0.2 0.2
		param_named diffusePower float 1.5
		param_named diffuse float3 0.8 0.8 0.8
		param_named lightDirection float3 0.0 2.0 2.0
		param_named lightColor float3 1.0 1.0 1.0
	}
}

fragment_program ColorConvertor/GrayScale_fp cg
{
	source GrayScale.cg
	entry_point calculateGrayScaleInMaterialColor
	profiles ps_2_0 fp30

	default_params
	{
		param_named grayRatio float 0.0
	}
}

material ColorConvertor/GrayScale
{
	technique
	{
		pass
		{
			vertex_program_ref ColorConvertor/GrayScale_vp
			{
			
			}
			// alternate shadow caster program
			fragment_program_ref ColorConvertor/GrayScale_fp
			{
			}

			texture_unit RT
			{
				texture nskingr.jpg 2d
			}
		}
	}
}

 - vertex_program은 버텍스 쉐이더
 - fragment_program은 픽셀 쉐이더

 - source는 쉐이더 코드 파일명
 - entry_point는 쉐이더 코드 함수명
 - profiles는 컴파일할 쉐이더 버전

 - param_named_auto는 3번째 값(위에서 worldviewproj_matrix, world_matrix)에 따라 ogre에서 매 프레임마다 알아서 갱신시켜주는 데이터
 - param_named는 C 코드에서 설정을 해주어야 하는 데이터

 - texture_unit은 텍스쳐 설정(위에서는 RT라는 이름으로 텍스쳐 설정, 쉐이더 코드의 RT에 매칭)

 - 이름에 '/'가 들어간 것은 계층구조의 의미가 아님. 그냥 통채로 이름이다.

 - 픽셀 쉐이더는 오히려 1.1 지원이 안되는 카드가 있음(여기 참고).

3. 엔터티에 메터리얼 설정

    Entity* head2 = mSceneMgr->createEntity("Head2", "ninja.mesh");
    MaterialPtr material = (Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton().getByName ("ColorConvertor/GrayScale");
    head2->setMaterial(material);
    Ogre::GpuProgramParametersSharedPtr filterParams = material->getTechnique(0)->getPass(0)->getVertexProgramParameters();
    filterParams->setNamedConstant("ambient", Vector3(0.2f, 0.2f, 0.2f));
    filterParams->setNamedConstant("diffusePower", 1.5f);
    filterParams->setNamedConstant("diffuse", Vector3(0.8f, 0.8f, 0.8f));
    filterParams->setNamedConstant("lightDirection", Vector3(0.0f, 2.0f, 2.0f));
    filterParams->setNamedConstant("lightColor", Vector3(1.0f, 1.0f, 1.0f));
    Ogre::GpuProgramParametersSharedPtr filterParams2 = material->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
    filterParams2->setNamedConstant("grayRatio", 0.0f);
- 쉐이더와 메터리얼 파일 경로를 resources_d.cfg에 포함시켜야 한다.
- 메터리얼에서 기본값을 설정해 놓았으면 코드에서 설정할 필요는 없다.
- 메터리얼의 상수값을 각 엔터티에 다르게 설정하고 싶으면 Ogre::Material::clone("새로운 메터리얼 이름") 함수를 사용해서 메터리얼을 복사해서 사용하면 된다. 복사된 메터리얼은 원본 메터리얼의 상수 설정값을 그대로 가지고 있다.
블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

// v2DScreen : 2D 화면 좌표
// plane : 화면 좌표 위치에 해당하는 점을 체크할 3D 공간상의 평면
// vPickPos : 2D 화면 좌표에 대응하는 3D 평면 상의 좌표
Ogre::Vector2 v2DScreen(100, 120);
Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0);
Ogre::Vector3 vPickPos(0, 0, 0);

unsigned int iWidth, iHeight, iColor;
int iLeft, iTop;
mWindow->getMetrics(iWidth, iHeight, iColor, iLeft, iTop);

Ogre::Ray mouseRay = mCamera->getCameraToViewportRay(v2DScreen.x/float(iWidth), v2DScreen.y/float(iHeight));
std::pair <bool, Ogre::Real> ret = mouseRay.intersects(plane);
if(ret.first)
{
    vPickPos = mouseRay.getPoint(ret.second);
}


블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

Ogre::Overlay*                 mMyOverlay;
Ogre::OverlayContainer*     mMyOverlayContainer;

mMyOverlay = Ogre::OverlayManager::getSingleton().create("MyOverlay");
mMyOverlayContainer = static_cast<Ogre::OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "MyOverlayElement"));

mMyOverlayContainer->setMetricsMode(Ogre::GMM_PIXELS);
mMyOverlayContainer->setPosition(100,100);
mMyOverlayContainer->setDimensions(30,30);
mMyOverlayContainer->setMaterialName("Examples/Rockwall");

mMyOverlay->add2D(mMyOverlayContainer);
mMyOverlay->show();



블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

// v3DWorld  : 3D 공간상의 좌표
// v2DScreen : 2D 스크린상의 좌표
Ogre::Vector4 v3DWorld(-50, 0, -75, 1.0f);
Ogre::Vector4 pos = mCamera->getProjectionMatrix() * mCamera->getViewMatrix() * v3DWorld;
Ogre::Vector2 v2DScreen(pos.x / pos.w, -pos.y / pos.w);    // -1.0 ~ 1.0 사이의 값
    
// 0.0 ~ 1.0 사이의 값으로 조정
v2DScreen.x = (v2DScreen.x + 1.0f) * 0.5f;
v2DScreen.y = (v2DScreen.y + 1.0f) * 0.5f;

unsigned int iWidth, iHeight, iColor;
int iLeft, iTop;
mWindow->getMetrics(iWidth, iHeight, iColor, iLeft, iTop);
// 화면 가로, 세로 크기에 맞추어 스케일링
v2DScreen.x *= iWidth;
v2DScreen.y *= iHeight;


블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

1. Win32 빈 프로젝트를 생성한다.

2. Ogre Wiki Tutorial Framework에서 파일을 받아서 생성한 프로젝트가 있는 폴더에 압축을 풀고 파일을 프로젝트에 추가한다.

3. 모두 저장.

4. 프로젝트 속성 페이지를 띄운다.

5. "구성"을 "모든 구성"으로 변경한 후 다음을 수정한다. 
단, OGRE_HOME 환경 변수가 설정되어 있어야 한다
(소스 빌드일 경우에는 ogre.sin 솔루션에서 Install 프로젝트를 빌드하면 생기는 SDK 폴더(CMAKE에서 CMAKE_INSTALL_PREFIX에 설정했던 폴더), SDK일 경우에는 SDK 루트 폴더로 설정되어 있어야 한다.)

General | Output Directory          : bin\$(ConfigurationName)
General | Intermediate Directory    : obj\$(ConfigurationName)
General | Character Set             : Use Multi-Byte Character Set

Debugging | Command                 : bin\$(ConfigurationName)\$(ProjectName).exe
Debugging | Working Directory       : bin\$(ConfigurationName)
Debugging | Environment             : path=$(OGRE_HOME)\Bin\$(ConfigurationName)

C/C++ | General | Additional Include Directories : $(OGRE_HOME)\include\OIS;$(OGRE_HOME)\include\OGRE;C:\Program Files\boost\boost_1_42

Linker | General | Additional Library Directories : $(OGRE_HOME)\lib\$(ConfigurationName);C:\Program Files\boost\boost_1_42\lib

6. "구성"을 "debug"로 변경한 후 다음을 수정한다.

Linker | Input | Additional Dependencies            : OgreMain_d.lib OIS_d.lib
Linker | Debugging | Generate Debug Info            : Yes (/DEBUG)

7. "구성"을 "release"로 변경한 후 다음을 수정한다.

Linker | Input | Additional Dependencies : OgreMain.lib OIS.lib
Linker | Debugging | Generate Debug Info : No

8. 컴파일 한다.

9. $(OGRE_HOME)\bin\$(ConfigurationName)\OgreMain_d.dll 을 $(프로젝트폴더)\bin\$(ConfigurationName) 폴더에 복사한다.
10. $(OGRE_HOME)\bin\$(ConfigurationName)\OIS_d.dll 을 $(프로젝트폴더)\bin\$(ConfigurationName) 폴더에 복사한다.

11. $(OGRE_HOME)\bin\$(ConfigurationName)\plugins_d.cfg 을 $(프로젝트폴더)\bin\$(ConfigurationName) 폴더에 복사한다.
12. $(OGRE_HOME)\bin\$(ConfigurationName)\resources_d.cfg 을 $(프로젝트폴더)\bin\$(ConfigurationName) 폴더에 복사한다.
13. 'plugins_d.cfg' 파일을 열어서 'PluginFolder' 를 $(OGRE_HOME)\bin\$(ConfigurationName) 으로 변경한다.
14. 'resource_d.cfg' 파일을 열어서 '../../media'로 되어 있는 부분을 모두 '$(OGRE_HOME)/bin/$(ConfigurationName)/media' 로 변경한다.

$(OGRE_HOME) 은 환경 변수로 설정된 ogre sdk의 루트 폴더를 말한다.
** $(ConfigurationName) 은 Visual Studio에서 빌드 구성으로 선택한 이름을 말한다. ex) debug, release 등등
*** 5번의 debugging 설정이 제대로 되면 9, 10, 13번은 하지 않고 건너뛰어도 된다.

'Ogre3D > 소스 빌드 및 Tutorial Framework 사용하기' 카테고리의 다른 글

OGRE 1.7 Memory Tracking  (0) 2011.07.12
Ogre Source 빌드 방법  (0) 2010.12.13
블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,

1. 
http://www.ogre3d.org/download/source에서 소스파일(OGRE 1.7.2 Source For Windows)과 추가 라이브러리 파일(Microsoft Visual C++ Dependencies Package)을 받는다.

2. 소스파일 압축파일(ogre_src_v1-7-2.exe)을 실행해서 압축을 푼다.

3. 추가 라이브러리 파일(OgreDependencies_MSVC_20100501.zip)의 압축을 푼다.

4. 압축을 푼 파일을 ogre 소스 폴더 밑에 Dependencies라는 폴더에 넣는다.

5. Dependencies\src에 솔루션 파일을 열어서 컴파일한다.

6. http://www.cmake.org/cmake/resources/software.html에서 cmake를 다운받아서 설치하고 실행한다.

7. "Where is the source code" 에 ogre 소스 파일의 루트 디렉토리를 설정한다.

8. "Where to build the binaries" 에 빌드 아웃풋(라이브러리, 헤더, dll, 샘플 실행파일)들이 출력될 폴더를 선택한다. 

9. 'Configure' 버튼을 클릭한다.

10. 빌드 디렉토리를 생성하려면 "Yes" 버튼을 클릭한다.

11. 타겟 컴파일러를 선택한다. 예)"Visual Studio 9 2008"

12. "Finish" 버튼을 클릭한다.

13. Configure 프로세스가 종료되기를 기다린다.

14. 설정 옵션 부분이 붉게 바뀐다(만약 이렇게 된다면 첫번째라는 것을 가리킨다). 
CMAKE_INSTALL_PREFIX를 실제 SDK 파일이 복사될 폴더로 변경한다.
OGRE_INSTALLSAMPLES를 체크하면 샘플들도 복사된다.
설정 변경에 대한 정보를 확인하려면 http://www.ogre3d.org/tikiwiki/Building+Ogre+with+CMake를 참고하면 된다.
다시 'Configure' 버튼을 클릭한다.

15. 설정 옵션 부분이 회색으로 바뀐다. "Generate" 버튼을 클릭한다.

16. "Where to build the binaries" 에 설정한 폴더에 빌드 파일이 생성되었다. 폴더에 가보면 'ogre.sin' 파일이 생성되어 있다.

17. 'ogre.sin' 파일을 열어서 컴파일을 한다.

18. 컴파일이 완료되면 'INSTALL' 프로젝트를 컴파일한다. 그러면 'SDK' 폴더가 생성되고 그곳에 SDK 관련 파일들이 복사가 된다.

블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,
* 다음 튜토리얼로 ogre 사용법을 배울 수 있다.

   첫 기본 튜토리얼

* 아래의 내용을 배우고 싶다면 The Advanced Ogre Framework 이라는 뛰어난 책이 있다는 얘기.
   - 게임 상태 시스템
   - 그래픽적인 유저 인터페이스
   - 다양한 입력 모드들
   - 씬 로딩
   - 수동 메터리얼 처리

블로그 이미지

영스파파

3D 세상을 만들기 위한 프로그래밍 정보들을 정리하는 공간

,