Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chaper 19 이펙트 프레임웍.

Similar presentations


Presentation on theme: "Chaper 19 이펙트 프레임웍."— Presentation transcript:

1 Chaper 19 이펙트 프레임웍

2 이펙트 프레임웍 Direct3D의 이펙트 프레임웍은 렌더링 효과와 관련된 작업들을 하나의 이펙트 파일로 캡슐화하는 메커니즘을 제공. 이펙트 파일의 이점 애플리케이션 소스 코드를 수정하지 않고도 효과의 구현을 변경할 수 있음. 즉, 효과의 수정이나 버그 제거, 간단한 효과 향상, 최신 3D 하드웨어 특성의 이용 등과 같은 작업이 훨씬 수월해질 수 있음 효과의 모든 요소들을 하나의 파일에 캡슐화 할 수 있음 2010-1학기 컴퓨터게임(DirectX)

3 테크닉과 패스 이펙트 파일은 하나 이상의 테크닉(technique)으로 구성됨.
테크닉은 특수 효과를 렌더링하기 위한 특정한 방법을 의미 이펙트 파일은 동일한 특수 효과를 렌더링하는 하나 이상의 다른 방법을 제공 동일한 특수 효과에 여러 가지의 다른 구현이 필요한 이유 하드웨어가 특정한 효과를 구현하기 위한 기능을 지원하지 않는 경우 여러 가지 다른 수준의 하드웨어를 위해 동일한 효과의 다른 버전을 구현할 필요가 있음 이펙트 프레임웍 캡슐화 효과 구현의 모든 버전을 하나의 이펙트 파일에 보관할 수 있게 되어 전반적인 효과의 완전한 캡슐화가 가능해짐 2010-1학기 컴퓨터게임(DirectX)

4 렌더링 패스 각각의 테크닉은 하나 이상의 렌더링 패스를 포함할 수 있음.
렌더링 패스는 장치 상태, 샘플러, 특정 패스의 기하물체를 렌더링하는데 필요한 셰이더 등을 캡슐화함 다수의 패스가 필요한 것은 특수 효과를 구현하기 위해 다른 장치 상태를 이용해 동일한 기하물체를 여러 번 렌더링해야 할 수도 있기 때문 2010-1학기 컴퓨터게임(DirectX)

5 두 개의 테크닉을 포함하는 이펙트 파일의 골격 //effect.txt …[패스 장치 상태, 셰이더, 샘플러 등의 지정]
첫 번째 테크닉은 하나의 패스를 포함하며, 두 번째 테크닉은 두 개의 패스로 구성 //effect.txt technique T0 { //현재 테크닉의 첫 번째이자 유일한 패스 pass P0 …[패스 장치 상태, 셰이더, 샘플러 등의 지정] } 2010-1학기 컴퓨터게임(DirectX)

6 technique T1 { //첫 번째 패스 pass P0 …[패스 장치 상태, 셰이더, 샘플러 등의 지정] }
//두 번째 패스 pass P1 2010-1학기 컴퓨터게임(DirectX)

7 부수적인 HLSL 고유 객체 텍스처 객체 HLSL의 고유한 texture 형은 IDirect3DTexture9 객체를 나타냄.
type – 텍스처의 타입(예, 2D, 3D) format – 텍스처의 픽셀 포맷 width – 픽셀 단위의 텍스처 너비 height – 픽셀 단위의 텍스처 높이 depth – 픽셀 단위의 텍스처 깊이(3D 볼륨 텍스처일 경우) 2010-1학기 컴퓨터게임(DirectX)

8 샘플러 객체와 샘플러 상태 이펙트 프레임웍은 sampler_state 라는 새로운 키워드를 제공
Texture Tex; sampler S0=sampler_state { Texture=(Tex); MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; }; 2010-1학기 컴퓨터게임(DirectX)

9 버텍스 셰이더와 픽셀 셰이더 객체 HLSL 고유의 형인 vertexshader와 pixelshader는 각각 버텍스 셰이더와 픽셀 셰이더를 나타내며, 이펙트 프레임웍 내에서 특정한 렌더링 패스에 이용될 버텍스 셰이더와 픽셀 셰이더를 지정 ID3DXEffect 인터페이스와 ID3DXEffect::SetVertexShader와 ID3DXEffect::SetPixelShader 메서드를 이용하면 애플리케이션에서 vertexshader나 pixelshader 형을 지정할 수 있음 2010-1학기 컴퓨터게임(DirectX)

10 버텍스 셰이더 초기화(1) 예를 들어, Effect가 ID3DXEffect 객체이고
VS가 IDirect3DVertexShader9 객체이며, VSHandle가 이펙트 파일 내의 vertexshader 객체를 참조하는 D3DXHANDLE 이라고 할 때, 다음과 같은 코드를 이용해 VSHandle이 참조하는 버텍스 셰이더를 초기화할 수 있음 Effect->SetVertexShader(VSHandle, VS); 2010-1학기 컴퓨터게임(DirectX)

11 버텍스 셰이더 초기화(2) 이외에도 이펙트 파일 내에서 직접 버텍스 셰이더나 픽셀 셰이더를 작성하는 방법이 있으며,
특수한 컴파일 구문을 이용해 셰이더 변수를 지정할 수도 있음. 다음 코드는 pixelshader 변수 ps를 초기화하는 예임 //Main 정의 OUTPUT Main(INPUT input){…} //Main 컴파일 pixelshader ps=compile ps_2_0 Main(); 이와 같은 스타일의 버텍스/픽셀 셰이더 객체 초기화를 이용하면 반드시 이펙트 파일 내에서 진입점 함수를 정의해야 함 2010-1학기 컴퓨터게임(DirectX)

12 특정 패스와 셰이더 연결 // Main 정의 OUTPUT Main(INPUT input){…} // Main 컴파일
vertexshader vs=compile vs_2_0 Main(); pass P0 { // ’vs’를 현재 패스의 버텍스 셰이더로 지정 vertexshader=(vs); } 2010-1학기 컴퓨터게임(DirectX)

13 //진입점 함수 “Main()”을 가진 버텍스 셰이더를 //현재 패스의 버텍스 셰이더로 지정
좀더 정확하게는 다음과 같음 pass P0 { //진입점 함수 “Main()”을 가진 버텍스 셰이더를 //현재 패스의 버텍스 셰이더로 지정 vertexShader=compile vs_2_0 Main(); } 2010-1학기 컴퓨터게임(DirectX)

14 문자열 string filename = “texName.bmp”
string형은 HLSL의 함수에는 이용되지 않지만 애플리케이션에서 읽고 이용할 수 있으며, 이를 통해 텍스처 파일명이나 XFile이름과 같이 이펙트가 이용하는 데이터 파일의 참조까지 완전하게 캡슐화할 수 있음 2010-1학기 컴퓨터게임(DirectX)

15 주석 변수에도 주석을 추가할 수 있음. HLSL은 직접 주석을 이용하진 않지만 애플리케이션은 이펙트 프레임웍을 통해 주석에 접근할 수 있으며, 주석은 변수와 연결할 수 있는 “노트”의 역할을 함 <주석> 형식을 이용해 주석을 추가하는 예 texture tex0 < string name = “tiger.bmp”;>; 주석은 < string name = “tiger.bmp”;>이며, 변수 tex0과 연결되어 있음. 2010-1학기 컴퓨터게임(DirectX)

16 다음과 같은 메서드를 이용하면 주석을 읽을 수 있음
D3DXHANDLE ID3DXEffect::GetAnnotationByName( D3DXHANDLE hObject, LPCSTR pName ); pName은 핸들을 얻고자 하는 주석의 이름이며 hObject은 테크닉이나 패스, 혹은 구조체 블록 등과 같이 주석을 포함하는 부모 블록으로의 핸들임. 주석으로의 핸들을 얻은 뒤에는 ID3DXEffect::GetParameterDesc 메서드로 D3DXCONSTANTDESC 구조체를 채워 필요한 정보를 얻을 수 있음 2010-1학기 컴퓨터게임(DirectX)

17 효과 파일 내의 장치 상태 올바른 효과 실행을 위해선 렌더링 상태, 텍스처 상태, 재질, 조명, 텍스처 등과 같은 장치 상태를 적절히 지정 이펙트 프레임웍은 하나의 이펙트 파일에 적용되는 효과를 완전하게 캡슐화하는 역할을 함. 장치 상태는 렌더링 패스 블록 내부에서 지정되며, 다음과 같은 구문이 이용됨 State=Value; 2010-1학기 컴퓨터게임(DirectX)

18 예: FillMode 상태 FillMode 상태에 대한 정보를 SDK에서 찾으면 이 값은 D3DFILL_ 접두어를 제외한 D3DFILLMODE와 같다는 것을 알 수 있음 D3DFILLMODE에 대한 정보를 찾으면 D3DFILL_POINT, D3DFILL_WIREFRAME, D3DFILL_SOLID 값이 있으며 이펙트 파일 내에서는 접두어를 생략해야 하므로 FillMode에 할당할 수 있는 값은 POINT, WIREFRAME, SOLID의 세 가지가 있음 다음 코드는 이펙트 파일에서 FillMode 값을 할당하는 예임 FillMode=WIREFRAME; FillMode=POINT; FillMode=SOLID; 2010-1학기 컴퓨터게임(DirectX)

19 이펙트 작성하기 이펙트는 ID3DXEffect 인터페이스를 통해 관리되며, 다음과 같은 D3DX 함수를 이용해 이 인터페이스를 만들 수 있음 HRESULT D3DXCreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile, CONST D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect, LPD3DXBUFFER *ppCompilationErrors ); 2010-1학기 컴퓨터게임(DirectX)

20 pDevice – 만들어질 ID3DXEffect 객체와 연결될 장치
pSrcFile – 컴파일하려는 이펙트 소스 코드를 포함하는 텍스트 파일의 이름 pDefines – 이 인자는 선택적이며 이 책에서는 null로 지정 pInclude – ID3DXInclude 인터페이스로의 포인터. 이 인터페이스는 애플리케이션에서 구현되어 우리가 디폴트 포함 동작을 오버라이드할 수 있도록 디자인 되어 있음 Flags – 이펙트 파일 내의 셰이더 컴파일에 이용될 선택적 플래그. 플래그 이용하지 않을 때는 0을 지정하며 다음과 같은 플래그를 이용할 수 있음 D3DXSHADER_DEBUG – 디버그 정보를 작성하도록 컴파일러에 지시 D3DXSHADER_SKIPVALIDATION – 코드 검증을 수행하지 않도록 컴파일러에 지시 D3DXSHADER_SKIPOPTIMIZATION – 코드 최적화를 수행하지 않도록 컴파일러에 지시 2010-1학기 컴퓨터게임(DirectX)

21 pPool – 이펙트 인자가 다른 이펙트 인스턴스와 공유되는 방법을 정의하는 ID3DXEffectPool 인스턴스로의 포인터
ppEffect – 만들어진 이펙트를 나타내는 ID3DXEffect 인터페이스로의 포인터를 리턴 ppCompilationErrors – 오류 코드와 메시지 문자열을 포함하는 ID3DXBuffer로의 포인터를 리턴 D3DXCreateEffectFromFile로의 호출 예 //이펙트 ID3DXEffect* Effect = 0; ID3DXEffect* errorBuffer = 0; hr = D3DXCreateEffectFromFile( Device, //연결된 장치 “effect.txt”, //소스 파일명 0, //전처리기 정의 없음 2010-1학기 컴퓨터게임(DirectX)

22 0, //ID3DXInclude 인터페이스 없음 D3DXSHADER_DEBUG, //컴파일 플래그 0, //인자 공유 없음
&Effect, //결과 리턴 &errorBuffer); //오류 문자열 리턴 //오류 메시지 출력 if(errorBuffer) { ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0,0); d3d::Release<ID3DXBuffer*>(errorBuffer); } if(FAILED(hr)) ::MessageBox(0, “D3DXCreateEffectFromFile() – FAILED”, 0,0); return false; 2010-1학기 컴퓨터게임(DirectX)

23 상수 설정 애플리케이션 소스 파일에서 이펙트 소스 파일의 변수를 초기화할 필요가 있음
이펙트 파일의 변수를 초기화 할 ID3DXEffect 인터페이스에서 제공하는 고유 메서드들을 이용 ID3DXEffect 인터페이스에서 제공하는 고유 메서드 이용 2010-1학기 컴퓨터게임(DirectX)

24 변수 초기화를 위한 메서드 HRESULT ID3DXEffect::SetFloat( D3DXHANDLE hParameter,
FLOAT f ); hParameter로 지정한 이펙트 파일의 부동소수점 변수를 f값으로 지정 HRESULT ID3DXEffect::SetMatrix( CONST D3DXMATRIX* pMatrix hParameter로 지정한 이펙트 파일의 행렬 변수를 pMatrix가 가리키는 값으로 지정 HRESULT ID3DXEffect::SetString( CONST LPCSTR pString hParameter로 지정한 이펙트 파일의 행렬 변수를 pString이 가리키는 값으로 지정 HRESULT ID3DXEffect::SetTexture( CONST D3DXVECTOR4* pTexture hParameter로 지정한 이펙트 파일의 텍스처 변수를 pTexture가 가리키는 값으로 지정 2010-1학기 컴퓨터게임(DirectX)

25 HRESULT ID3DXEffect::SetVector( D3DXHANDLE hParameter,
CONST D3DXVECTOR4* pVector ); hParameter로 지정한 이펙트 파일의 벡터 변수를 pVector가 가리키는 값으로 지정 HRESULT ID3DXEffect::SetVertexShader( LPDIRECT3DVERTEXSHADER9 pVertexShader hParameter로 지정한 이펙트 파일의 버텍스 셰이더 변수를 pVector가 가리키는 값으로 지정 HRESULT ID3DXEffect::SetPixelShader( LPDIRECT3DPIXELSHADER9 pPShader hParameter로 지정한 이펙트 파일의 픽셀 셰이더 변수를 pShader가 가리키는 값으로 지정 2010-1학기 컴퓨터게임(DirectX)

26 다음의 메서드를 이용해 변수의(이펙트 인자) 핸들을 얻음
D3DXHANDLE ID3DXEffect::GetParameterByName( D3DXHANDLE hParent, // 변수의 유효 범위 – 부모 구조체 LPCSTR pName // 변수 이름 ); 2010-1학기 컴퓨터게임(DirectX)

27 이펙트 파일의 변수 지정 예 //약간의 데이터를 지정 D3DXMATRIX M; D3DXMatrixIdentity(&M);
D3DXVECTOR4 color(1.0f, 0.0f, 1.0f, 1.0f); IDirect3DTexture9* tex=0; D3DXCreateTextureFrom File(Device, “shade.bmp”, &tex); //핸들을 얻는다 D3DXHANDLE MatrixHandle = Effect-> GetParameterByName(0, “Matrix”); D3DXHANDLE MtrlHandle = Effect-> GetParameterByName(0, “Mtrl”); D3DXHANDLE TexHandle = Effect-> GetParameterByName(0, “Tex”); 2010-1학기 컴퓨터게임(DirectX)

28 Effect->SetMatrix(MatrixHandle, &M);
//인자를 지정 Effect->SetMatrix(MatrixHandle, &M); Effect->SetVector(MtrlHandle, &color); Effect->SetTexture(TexHandle, tex); 2010-1학기 컴퓨터게임(DirectX)

29 이펙트 이용하기 만든 이펙트를 이용하는 과정 이펙트 파일 내의 이용하려는 테크닉의 핸들을 얻는다 원하는 테크닉을 활성화
활성화된 테크닉을 시작 활성화된 테크닉 내의 각 렌더링 패스에 기하물체를 렌더링함. 테크닉은 여러 개의 렌더링 패스로 구성될 수 있으며, 각 패스마다 한 번씩 기하물체를 렌더링해야 함 활성화된 테크닉을 종료 2010-1학기 컴퓨터게임(DirectX)

30 D3DXHANDLE ID3DXEffect::GetTechniqueByName( LPCSTR pName //테크닉의 이름 );
이펙트로의 핸들 얻기 D3DXHANDLE ID3DXEffect::GetTechniqueByName( LPCSTR pName //테크닉의 이름 ); 이펙트 활성화 HRESULT ID3DXEffect::SetTechnique( D3DXHANDLE hTechnique // 지정하려는 테크닉의 핸들 2010-1학기 컴퓨터게임(DirectX)

31 이펙트 시작하기 HRESULT ID3DXEffect::Begin(
이펙트를 이용해 기하물체를 렌더링하기 위해서는 ID3DXEffect::Begin과 ID3DXEffect::End 메서드로 드로잉 함수를 감싸야 함. HRESULT ID3DXEffect::Begin( UNIT* pPasses, DWORD Flags ); pPasses – 현재 활성화된 테크닉 내의 패스의 수를 리턴 Flags – 다음의 플래그 중 하나가 될 수 있음 Zero(0) – 현재의 장치 상태와 셰이더 상태를 보관했다가 이펙트가 종료할 때 상태를 복구할 것을 지시 D3DXFX_DONOTSAVESTATE – 장치의 상태를 보관했다가 복구할 것을 지시 D3DXFX_DONOTSAVESHADERSTATE – 셰이더 상태를 보관하고 복구하지 않을 것을 지정 2010-1학기 컴퓨터게임(DirectX)

32 현재의 렌더링 패스 지정 이펙트를 이용해 기하물체를 렌더링하기 전에, 이용할 렌더링 패스를 지정하는 과정이 먼저 필요
테크닉은 하나 이상의 렌더링 패스로 구성되며, 각각의 패스는 다른 장치 상태와 샘플러, 셰이더 등을 캡슐화함 렌더링 패스 지정 메서드 HRESULT ID3DXEffect::Pass( UNIT iPass // 패스 식별을 위한 인덱스 ); 테크닉의 렌더링 패스는 0 … n-1형식의 간단한 인덱스를 가짐. 따라서 간단한 루프를 이용해 각 패스 내의 기하물체를 렌더링할 수 있음 2010-1학기 컴퓨터게임(DirectX)

33 이펙트 종료하기 마지막으로 각 패스의 기하물체를 렌더링한 뒤에는 ID3DXEffect::End 메서드를 이용해 이펙트를 종료
HRESULT ID3DXEffect::End(VOID); 2010-1학기 컴퓨터게임(DirectX)

34 예제 이펙트를 이용하는 데 필요한 다섯 개의 단계 //이펙트 파일 technique T0 { pass P0 … }
2010-1학기 컴퓨터게임(DirectX)

35 ==================== //애플리케이션 소스 코드 //테크닉 핸들을 얻음 D3DXHANDLE hTech = 0;
hTech = Effect->GetTechniqueByName(“T0”); //테크닉 활성화 Effect->SetTechnique(hTech); //활성화 테크닉을 시작 UNIT numPasses = 0; Effect->Begin(&numPasses, 0); //각각의 렌더링 패스에 대해서, for(int i=0;i<numPasses;i++) { 2010-1학기 컴퓨터게임(DirectX)

36 //현재의 패스를 지정 Effect->Pass(i); //i번째 패스의 기하물체를 렌더링함 Sphere-Draw(); }
//이펙트 종료 Effect->End(); 2010-1학기 컴퓨터게임(DirectX)

37 예제 애플리케이션: 이펙트 파일에서의 조명과 텍스처링
이 예제는 완전히 고정 기능 파이프라인에서 동작하며 이펙트 프레임웍이 셰이더만을 위한 것은 아니라는 사실을 확인시켜줌 2010-1학기 컴퓨터게임(DirectX)

38 // Author: Frank Luna (C) All Rights Reserved
/////////////////////////////////////////////////////////////////////////// // // File: light_tex.txt // Author: Frank Luna (C) All Rights Reserved // System: AMD Athlon XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 // Desc: Effect file that handles device states for lighting and texturing // a 3D model. //////////////////////////////////////////////////////////////////////////// // Globals 2010-1학기 컴퓨터게임(DirectX)

39 sampler S0 = sampler_state { Texture = (Tex); MinFilter = LINEAR;
matrix WorldMatrix; matrix ViewMatrix; matrix ProjMatrix; texture Tex; // Sampler sampler S0 = sampler_state { Texture = (Tex); MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; }; // Effect 2010-1학기 컴퓨터게임(DirectX)

40 technique LightAndTexture { pass P0 // // Set Misc render states.
pixelshader = null; vertexshader = null; fvf = XYZ | Normal | Tex1; Lighting = true; NormalizeNormals = true; SpecularEnable = false; // Set Transformation States 2010-1학기 컴퓨터게임(DirectX)

41 WorldTransform[0] = (WorldMatrix); ViewTransform = (ViewMatrix);
ProjectionTransform = (ProjMatrix); // Set a light source at light index 0. We fill out all the // components for light[0] because The Direct3D // documentation recommends us to fill out all components // for best performance. LightType[0] = Directional; LightAmbient[0] = {0.2f, 0.2f, 0.2f, 1.0f}; LightDiffuse[0] = {1.0f, 1.0f, 1.0f, 1.0f}; LightSpecular[0] = {0.0f, 0.0f, 0.0f, 1.0f}; LightDirection[0] = {1.0f, -1.0f, 1.0f, 0.0f}; LightPosition[0] = {0.0f, 0.0f, 0.0f, 0.0f}; LightFalloff[0] = 0.0f; 2010-1학기 컴퓨터게임(DirectX)

42 LightAttenuation0[0] = 1.0f; LightAttenuation1[0] = 0.0f;
LightRange[0] = 0.0f; LightTheta[0] = 0.0f; LightPhi[0] = 0.0f; LightAttenuation0[0] = 1.0f; LightAttenuation1[0] = 0.0f; LightAttenuation2[0] = 0.0f; // Finally, enable the light: LightEnable[0] = true; // Set Material components. This is like calling // IDirect3DDevice9::SetMaterial. MaterialAmbient = {1.0f, 1.0f, 1.0f, 1.0f}; MaterialDiffuse = {1.0f, 1.0f, 1.0f, 1.0f}; 2010-1학기 컴퓨터게임(DirectX)

43 MaterialEmissive = {0.0f, 0.0f, 0.0f, 0.0f}; MaterialPower = 1.0f;
MaterialSpecular = {1.0f, 1.0f, 1.0f, 1.0f}; // // Hook up the sampler object to sampler stage 0, // which is given by Sampler[0]. Sampler[0] = (S0); } 2010-1학기 컴퓨터게임(DirectX)

44 이 이펙트 파일의 가장 중요한 작업은 장치 상태의 설정 광원과 재질을 이펙트 파일 내에서 직접 지정했으며,
변환 행렬과 텍스처, 적용할 샘플러 상태를 지정. 이렇게 지정된 상태는 LightAndTexture 테크닉과 렌더링 패스 P0을 이용해 렌더링되는 모든 기하물체에 적용 조명, 재질, 텍스처 등과 같은 대부분의 중요한 작업들이 모두 이펙트 파일에서 처리됨 애플리케이션 코드는 단순히 이 이펙트를 만들고 이를 활성화하기만 하면 됨 2010-1학기 컴퓨터게임(DirectX)

45 ID3DXEffect* LightTexEffect = 0; D3DXHANDLE WorldMatrixHandle = 0;
예제는 다음과 같은 전역 변수들을 가지고 있음 ID3DXEffect* LightTexEffect = 0; D3DXHANDLE WorldMatrixHandle = 0; D3DXHANDLE ViewMatrixHandle = 0; D3DXHANDLE ProjMatrixHandle = 0; D3DXHANDLE TexHandle = 0; D3DXHANDLE LightTexTechHandle = 0; Setup 함수는 이펙트를 만들고, 이펙트 인자와 테크닉으로의 핸들을 얻고, 몇 가지 이펙트 인자를 초기화 하는 세 가지의 중요한 작업을 수행. 2010-1학기 컴퓨터게임(DirectX)

46 ID3DXBuffer* errorBuffer = 0; hr = D3DXCreateEffectFromFile( Device,
bool Setup() { HRESULT hr = 0; // … Xfile읽기 코드는 생략됨 // Create effect. ID3DXBuffer* errorBuffer = 0; hr = D3DXCreateEffectFromFile( Device, "light_tex.txt", 0, // no preprocessor definitions 0, // no ID3DXInclude interface D3DXSHADER_DEBUG, // compile flags 0, // don't share parameters &LightTexEffect, &errorBuffer); 2010-1학기 컴퓨터게임(DirectX)

47 // output any error messages if( errorBuffer ) {
::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0); d3d::Release<ID3DXBuffer*>(errorBuffer); } if(FAILED(hr)) ::MessageBox(0, "D3DXCreateEffectFromFile() - FAILED", 0, 0); return false; // Save Frequently Accessed Parameter Handles WorldMatrixHandle = LightTexEffect-> GetParameterByName(0, "WorldMatrix"); 2010-1학기 컴퓨터게임(DirectX)

48 TexHandle = LightTexEffect->GetParameterByName(0, "Tex");
ViewMatrixHandle = LightTexEffect->GetParameterByName(0, "ViewMatrix"); ProjMatrixHandle = LightTexEffect->GetParameterByName(0, "ProjMatrix"); TexHandle = LightTexEffect->GetParameterByName(0, "Tex"); LightTexTechHandle = LightTexEffect->GetTechniqueByName("LightAndTexture"); // Set Effect Parameters // Set Matrices D3DXMATRIX W, P; D3DXMatrixIdentity(&W); LightTexEffect->SetMatrix( WorldMatrixHandle, &W); 2010-1학기 컴퓨터게임(DirectX)

49 D3DXMatrixPerspectiveFovLH( &P, D3DX_PI * 0.25f, // 45 - degree
(float)Width / (float)Height, 1.0f, f); LightTexEffect->SetMatrix( ProjMatrixHandle, &P); // Set texture IDirect3DTexture9* tex = 0; D3DXCreateTextureFromFile(Device, "Terrain_3x_diffcol.jpg", &tex); LightTexEffect->SetTexture(TexHandle, tex); d3d::Release<IDirect3DTexture9*>(tex); return true; } 2010-1학기 컴퓨터게임(DirectX)

50 bool Display(float timeDelta) { if( Device ) // … 카메라 갱신 코드는 생략됨
LightTexEffect->SetMatrix(ViewMatrixHandle, &V); // Activate the Technique and Render Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); // set the technique to use LightTexEffect->SetTechnique( LightTexTechHandle ); 2010-1학기 컴퓨터게임(DirectX)

51 LightTexEffect->Begin(&numPasses, 0);
UINT numPasses = 0; LightTexEffect->Begin(&numPasses, 0); for(int i = 0; i < numPasses; i++) { LightTexEffect->Pass(i); for(int j = 0; j < Mtrls.size(); j++) Mesh->DrawSubset(j); } LightTexEffect->End(); Device->EndScene(); Device->Present(0, 0, 0, 0); return true; 2010-1학기 컴퓨터게임(DirectX)

52 예제 애플리케이션 : 안개 효과 안개 효과는 장면의 사실감을 극적으로 향상시켜주며 기후 상태를 시뮬레이트하는 데도 이용될 수 있음 거리가 먼 클립 평면의 잔존 물을 제거하는 데도 상당한 도움을 줄 수 있음 Direct3D 안개는 고정 기능 파이프라인의 일부이며, 렌더 상태에 의해 제어. 2010-1학기 컴퓨터게임(DirectX)

53 // Author: Frank Luna (C) All Rights Reserved
//////////////////////////////////////////////////////////////////////////// // // File: fog.txt // Author: Frank Luna (C) All Rights Reserved // System: AMD Athlon XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 // Desc: Effect file that handles device states for linear vertex fog. // Effect technique Fog { 2010-1학기 컴퓨터게임(DirectX)

54 // Set Misc render states. pixelshader = null; vertexshader = null;
pass P0 { // Set Misc render states. pixelshader = null; vertexshader = null; fvf = XYZ | Normal; Lighting = true; NormalizeNormals = true; SpecularEnable = false; // Fog States FogVertexMode = LINEAR; // linear fog function FogStart = 50.0f; // fog starts 50 units away from viewpoint FogEnd = 300.0f; // fog ends 300 units away from viewpoint 2010-1학기 컴퓨터게임(DirectX)

55 FogColor = 0x00CCCCCC; // gray FogEnable = true; // enable }
선형 버텍스 안개는 다섯 개의 간단한 렌더 상태를 통해 제어됨 FogvertexMode – 버텍스 안개에 이용할 안개 함수를 지정. 안개 함수는 거리에 따라 안개가 짙어지는 방법을 정의. 선택할 수 있는 할당 형에는 LINEAR, EXP, EXP2가 있으며, 이들 함수는 다음과 같이 정의 2010-1학기 컴퓨터게임(DirectX)

56 FogStart – 물체 안개 적용이 시작할 시작 깊이를 표시 FogEnd – 물체 안개 적용이 끝날 종료 깊이를 표시
FogColor – 안개의 컬러를 지정하는 DWORD나 D3DCOLOR값 FogEnable – 버텍스 안개를 켤 때는 True를, 끌 때는 False를 지정 이제 fog.txt 이펙트를 이용해 렌더링하는 기하물체에는 모두 안개가 적용 2010-1학기 컴퓨터게임(DirectX)

57 2010-1학기 컴퓨터게임(DirectX)

58 예제 애플리케이션 : 카툰 효과 //////////////////////////////////////////////////////////////////////////// // // File: tooneffect.txt // Author: Frank Luna (C) All Rights Reserved // System: AMD Athlon XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 // Desc: Cartoon shader in an effect file. 2010-1학기 컴퓨터게임(DirectX)

59 extern matrix WorldViewMatrix; extern matrix WorldViewProjMatrix;
// Globals extern matrix WorldViewMatrix; extern matrix WorldViewProjMatrix; extern vector Color; extern vector LightDirection; extern texture ShadeTex; // Structures struct VS_INPUT { vector position : POSITION; vector normal : NORMAL; }; 2010-1학기 컴퓨터게임(DirectX)

60 vector position : POSITION; float2 uvCoords : TEXCOORD;
struct VS_OUTPUT { vector position : POSITION; float2 uvCoords : TEXCOORD; vector diffuse : COLOR; }; // Main VS_OUTPUT Main(VS_INPUT input) // zero out each member in output VS_OUTPUT output = (VS_OUTPUT)0; // transform vertex position to homogenous clip space output.position = mul(input.position, WorldViewProjMatrix); 2010-1학기 컴퓨터게임(DirectX)

61 // Transform lights and normals to view space. Set w
// components to zero since we're transforming vectors. // Assume there are no scalings in the world // matrix as well. // LightDirection.w = 0.0f; input.normal.w = 0.0f; LightDirection = mul(LightDirection, WorldViewMatrix); input.normal = mul(input.normal, WorldViewMatrix); // Compute the 1D texture coordinate for toon rendering. float u = dot(LightDirection, input.normal); // Clamp to zero if u is negative because u // negative implies the angle between the light // and normal is greater than 90 degrees. And // if that is true then the surface receives // no light. 2010-1학기 컴퓨터게임(DirectX)

62 // Set other tex coord to middle. float v = 0.5f;
if( u < 0.0f ) u = 0.0f; // // Set other tex coord to middle. float v = 0.5f; output.uvCoords.x = u; output.uvCoords.y = v; // save color output.diffuse = Color; return output; } 2010-1학기 컴퓨터게임(DirectX)

63 sampler ShadeSampler = sampler_state { Texture = (ShadeTex);
MinFilter = POINT; // no filtering for cartoon shading MagFilter = POINT; MipFilter = NONE; }; // Effect technique Toon pass P0 vertexShader = compile vs_1_1 Main(); Sampler[0] = (ShadeSampler); } 2010-1학기 컴퓨터게임(DirectX)

64 2010-1학기 컴퓨터게임(DirectX)


Download ppt "Chaper 19 이펙트 프레임웍."

Similar presentations


Ads by Google