Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 18 장 픽셀 셰이더의 소개.

Similar presentations


Presentation on theme: "제 18 장 픽셀 셰이더의 소개."— Presentation transcript:

1 제 18 장 픽셀 셰이더의 소개

2 픽셀 셰이더의 소개 픽셀 셰이더는 각 픽셀의 레스터라이즈 과정을 위해 그래픽 카드의 GPU에서 실행되는 프로그램
버텍스 셰이더와는 달리 소프트웨어적으로 픽셀 셰이더의 기능을 애뮬레이트하지 않음 고정 기능 파이프라인의 멀티 텍스처링 단계를 대체하며, 각각의 픽셀을 직접 처리 픽셀의 텍스처 좌표에 접근하는 능력을 제공 멀티 텍스처링이나 픽셀 당 조명, 필드 깊이, 구름 시뮬레이션, 불 시뮬레이션, 그리고 복잡한 그림자 테크닉과 같은 특수 효과를 가능하게 해줌 그래픽 카드가 지원하는 픽셀 셰이더의 버전을 알아내기 위해서는 D3DCAPS9 구조체의 PixelShaderVersion 멤버와 D3DPS_VERSION 매크로를 이용 //만약 장치에서 지원되는 버전이 2.0보다 작다면 if(caps.PixelShaderVersion < D3DPS_VERSION(2,0)) //현재 장치에서는 픽셀 셰이더 2.0 버젼이 지원되지 않는 것임 2010-1학기 컴퓨터게임(DirectX)

3 멀티 텍스처링 둘러보기 픽셀 셰이더를 이용해 구현할 수 있는 가장 단순한 테크닉
여러 개의 텍스처를 동시에 활성화하고 텍스처들이 블렌드 되는 방법을 정의하여 특수한 효과를 얻는 것 멀티 텍스처링의 가장 흔한 용도는 조명을 대체하는 것으로 버텍스 처리 단계의 Direct3D 조명 모델 대신에 표면이 받을 빛을 미리 계산한 라이트 맵(light map)이라는 특수한 텍스처 맵을 이용 2010-1학기 컴퓨터게임(DirectX)

4 텍스처들을 블렌드하여 조명을 대신하는 이점 스포트라이트 라이트 맵에 조명이 미리 계산될 수 있음.
런타임시에 조명을 계산할 필요 없으므로 전반적인 처리 속도가 향상. 라이트 맵이 미리 계산되므로 Direct3D의 모델보다 훨씬 정확하고 정교한 광원 모델을 이용할 수 있음 2010-1학기 컴퓨터게임(DirectX)

5 멀티 텍스처의 활성화 텍스처 지정에는 IDirect3DDevice9::SetTexture 메서드가 이용되며 샘플러 상태 지정에는 IDirect3DDevice9::SetSamplerState 메서드가 이용. 두 메서드의 프로토타입은 다음과 같음 HRESULT IDirect3DDevice9::SetTexture( DWORD Stage, //텍스처 상태 인덱스를 지정 IDirect3DBaseTexture9 *pTexture ); HRESULT IDirect3DDevice9::SetSamplerState( DWORD Sampler, //샘플러 상태 인덱스를 지정 D3DSAMPLERSTATETYPE Type, DWORD Value 2010-1학기 컴퓨터게임(DirectX)

6 텍스처/샘플러 상태 인덱스는 우리가 텍스처/샘플러에 적용하고자 하는 텍스처/샘플러 상태를 지정하는데 쓰임.
즉, 상태 인덱스를 이용해 다수의 텍스처와 이에 대응되는 샘플러 상태를 활성화할 수 있음 지금까지 이 책에서는 한 개의 텍스처만을 이용했으므로 0을 지정하여 첫번째 상태를 표기했으므로, 세 개의 텍스처를 활성화해야 한다면 다음과 같이 0, 1, 2 상태를 이용하면 됨 2010-1학기 컴퓨터게임(DirectX)

7 Device->SetTexture(0, Tex1);
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // spotlight tex Device->SetTexture(1, Tex2); Device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 2010-1학기 컴퓨터게임(DirectX)

8 Device->SetTexture(2, Tex3);
// string tex Device->SetTexture(2, Tex3); Device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 이 코드는 Tex1, Tex2, Tex3을 활성화하고 각 텍스처의 필터링 모드를 지정 2010-1학기 컴퓨터게임(DirectX)

9 멀티 텍스처 좌표 텍스처링 할 때 3D 삼각형을 표현하기 위해 텍스처 내에 적절한 삼각형을 정의했으며, 이를 위해 각 버텍스에 텍스처 좌표를 추가했었음. 지금은 멀티 텍스처를 이용하고 있으므로, 삼각형을 정의하는 세 개의 버텍스에 대해 활성화된 모든 텍스처의 삼각형을 정의해야 함. 각 버텍스에 부가적인 텍스처 좌표 세트를 추가 예를 들어, 세 개의 텍스처를 블렌딩하길 원한다면 각 버텍스는 활성화된 세 개의 텍스처를 위한 세 개의 텍스처 좌표 세트를 가져야 함 2010-1학기 컴퓨터게임(DirectX)

10 3개의 텍스처를 이용하는 멀티 텍스처링에서의 버텍스 구조체 struct MultiTexVertex {
MultiTexVertex(float x, float y, float z, float u0, float v0, float u1, float v1, float u2, float v2) _x = x; _y = y; _z = z; _u0 = u0; _v0 = v0; _u1 = u1; _v1 = v1; _u2 = u2, _v2 = v2; } 2010-1학기 컴퓨터게임(DirectX)

11 static const DWORD FVF; };
float _x, _y, _z; float _u0, _v0; float _u1, _v1; float _u2, _v2; static const DWORD FVF; }; const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3; 유연한 버텍스 포맷 플래그 D3DFVF_TEX3을 지정하여 버텍스 구조체가 3세트의 텍스처 좌표를 포함하고 있음을 표시. 고정 기능 파이프라인은 최대 여덟 개까지의 텍스처 좌표를 지원하므로, 여덟 개 이상을 이용하려면 버텍스 선언과 프로그래머블 버텍스 파이프라인을 이용해야 함 2010-1학기 컴퓨터게임(DirectX)

12 픽셀 셰이더의 입출력 픽셀 셰이더로의 입력은 컬러와 텍스처 좌표 두 가지이며, 두 가지 모두 각 픽셀 당 입력됨
픽셀 당 텍스처 좌표란 해당 픽셀에 매핑될 텍스처의 텍셀을 지정하는 (u, v) 좌표임. 예를 들어, 버텍스 셰이더가 두 개의 컬러와 세 개의 텍스처 좌표를 출력한다면 Direct3D는 각 픽셀 당 두 개의 컬러와 세 개의 텍스처 좌표를 계산하고 이를 픽셀 셰이더로 입력함 미리 지정된 형식에 맞게 컬러와 텍스처 좌표를 입력하여 픽셀 셰이더 프로그램의 변수와 매핑 2010-1학기 컴퓨터게임(DirectX)

13 출력에서 픽셀 셰이더는 다음과 같이 각 픽셀 당 계산된 하나의 컬러 값을 출력 struct PS_OUTPUT
struct PS_INPUT { vector c0 : COLOR0; vector c1 : COLOR1; float2 t0 : TEXCOORD0; float2 t1 : TEXCOORD1; float2 t2 : TEXCOORD2; }; 출력에서 픽셀 셰이더는 다음과 같이 각 픽셀 당 계산된 하나의 컬러 값을 출력 struct PS_OUTPUT vector finalPixelColor : COLOR0; 2010-1학기 컴퓨터게임(DirectX)

14 픽셀 셰이더 이용의 단계 픽셀 셰이더를 만들고 이용하기 위해 필요한 단계를 다음과 같이 정리
1) 픽셀 셰이더를 작성하고 컴파일함 2) 컴파일된 셰이더 코드를 기반으로 하는 픽셀 셰이더를 나타내는 IDirect3DPixelShader9 인터페이스를 만듦 3) IDirect3DDevice9::SetPixelShader 메서드를 이용해 픽셀 셰이더를 활성화 4) 셰이더를 이용하는 작업이 끝난 뒤에는 해당 셰이더를 제거해야 함 2010-1학기 컴퓨터게임(DirectX)

15 픽셀 셰이더의 작성과 컴파일 픽셀 셰이더를 컴파일하는 방법은 버텍스 셰이더를 컴파일할 때와 동일
먼저 픽셀 셰이더 프로그램을 작성해야 하는데, 여기서는 HLSL을 이용해 셰이더를 작성 셰이더 코드를 작성한 다음에는 D3DXCompileShaderFromFile 함수를 이용해 셰이더를 컴파일. 이 함수는 컴파일된 셰이더 코드를 포함하는 ID3DXBuffer로의 포인터를 리턴 2010-1학기 컴퓨터게임(DirectX)

16 픽셀 셰이더를 만들기 컴파일된 셰이더 코드를 얻은 뒤에는 다음의 메서드를 이용해 픽셀 셰이더를 나타내는 IDirect3DPixelShader9 인터페이스로의 포인터를 얻을 수 있음 HRESULT IDirect3DDevice9::CreatePixelShader( CONST DWORD *pFunction, IDirect3DPixelShader9** ppShader ); pFunction – 컴파일된 셰이더 코드로의 포인터 ppShader – IDirect3DPixelShader9 인터페이스로의 포인터를 리턴 2010-1학기 컴퓨터게임(DirectX)

17 예를 들어 컴파일된 셰이더 코드를 포함하는 ID3DXBuffer를 가지고 있다고 할 때,
다음과 같은 코드를 이용해 IDirect3DPixelShader9 인터페이스를 얻을 수 있음 IDirect3DPixelShader9* MultiTexPS = 0; hr=Device->CreatePixelShader( (DWORD*)shader->GetBufferPointer(), &MultiTexPS); 2010-1학기 컴퓨터게임(DirectX)

18 픽셀 셰이더 설정하기 픽셀 셰이더를 나타내는 IDirect3DPixelShader9 인터페이스로의 포인터를 얻은 뒤에는 다음의 메서드를 이용해 셰이더를 활성화함 HRESULT IDirect3DDevice9::SetPixelShader( IDirect3DPixelShader9* pShader ); 이 메서드는 활성화할 픽셀 셰이더를 가리키는 포인터를 인자로 받음 섹션에서 만든 셰이더를 활성화하려면 다음과 같은 코드를 이용하면 됨 Device->SetPixelShader(MultiTexPS); 2010-1학기 컴퓨터게임(DirectX)

19 픽셀 셰이더 제거하기 다른 Direct3D의 인터페이스들과 마찬가지로 이용이 끝난 인터페이스는 Release 메서드를 호출하여 제거해야 함. 섹션에서 만든 픽셀 셰이더를 제거하려면 다음과 같은 코드를 이용하면 됨 D3D::Release<IDirect3DPixelShader9*>(MultiTexPS); 2010-1학기 컴퓨터게임(DirectX)

20 HLSL 샘플러 객체 텍스처는 픽셀 셰이더 내에서 HLSL의 특수한 tex* 관련 내장 함수를 이용해 샘플링 됨
샘플링이란 픽셀의 텍스처 좌표와 샘플러 상태(텍스처 필터 상태)에 따라 픽셀의 텍셀에 인덱싱하는 과정 일반적으로 이 함수들은 다음과 같이 두 가지 정보를 필요로 함 텍스처로의 인덱스에 이용할 텍스처 좌표(u, v) 인덱스할 특정 텍스처 텍스처 좌표(u, v)는 물론 픽셀 셰이더로의 입력으로 전달되며,인덱스 하려는 샘플러라 불리는 특수한 HLSL 객체로 지정됨 샘플러 객체는 텍스처와 샘플러 상태를 식별하기 위한 객체로 생각 2010-1학기 컴퓨터게임(DirectX)

21 예를 들어, 세 개의 텍스처 상태를 이용하고 있다면 픽셀 셰이더에서도 각각의 상태를 참조할 수 있어야 하며,
픽셀 셰이더 내에서는 다음과 같은 코드 형식을 이용하면 됨 sampler FirstTex; sampler SecondTex; sampler ThirdTex; 샘플러 객체를 고유한 텍스처 상태와 연결하는 과정은 Direct3D가 처리해줌. 실제 애플리케이션에서는 샘플러 객체와 대응되는 상태를 찾고, 이 상태를 위한 텍스처와 샘플러 상태를 지정하면 됨 2010-1학기 컴퓨터게임(DirectX)

22 FirstText의 텍스처와 샘플러 상태를 지정하는 예
//텍스처를 만든다. IDirect3DTexture9* Tex; D3DXCreateTextureFromFile(device, “tex.bmp”, &tex); //상수로의 핸들을 얻는다. FirstTexHandle=MultiTexCT-> GetConstantByName(0,”FirstTex”); //상수 정보를 얻는다 D3DXCONSTANT_DESC FirstTexDesc; UNIT count; MultiTexCT->GetConstantDesc(FirstTexHandle, &FirstTexDesc, &count); 2010-1학기 컴퓨터게임(DirectX)

23 //FirstTex 샘플러의 텍스처/샘플러 상태를 지정
//우리는 D3DXCONSTANT_DESC::RegisterIndex member //멤버로 연결된 FirstTex상태를 식별 Device->SetTexture(FirstTexDesc.RegisterIndex, Tex); Device->SetSamplerState(FirstTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(FirstTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(FirstTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 2010-1학기 컴퓨터게임(DirectX)

24 예제 애플리케이션: 픽셀 셰이더에서의 멀티 텍스처링
픽셀 셰이더를 이용한 멀티 텍스처링 구현 예를 보여주는 것 나무 상자 텍스처와 스포트라이트 텍스처를 블렌드한 결과를 다시 “Pixel Shader Sample.”이라는 문자열을 포함하는 텍스처와 블렌드 함 이 예제에서는 한 번에 세 개의 텍스처를 이용하고 있지만 각각의 픽셀 셰이더 버전에서 지원되는 샘플러 객체의 수를 테스트해보는 것도 좋을 것임. 픽셀 셰이더 ps_1_1에서 ps_1_3은 네 개까지의 텍스처 샘플을 지원 픽셀 셰이더 버전 ps_1_4는 여섯 개의 텍스처 샘플을 지원 픽셀 셰이더 버전 ps_2_0에서 ps_3_0은 16개의 텍스처 샘플을 지원 2010-1학기 컴퓨터게임(DirectX)

25 두 개의 텍스처를 이용하는 멀티 텍스처링 픽셀 셰이더 코드
//////////////////////////////////////////////////////////////////////////// // // File: ps_alphablend.txt // Author: Frank Luna (C) All Rights Reserved // System: AMD Athlon XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 // Desc: Pixel shader that does multi texturing. // Globals 2010-1학기 컴퓨터게임(DirectX)

26 sampler SpotLightTex; sampler StringTex; // Structures struct PS_INPUT
sampler BaseTex; sampler SpotLightTex; sampler StringTex; // Structures struct PS_INPUT { float2 base : TEXCOORD0; float2 spotlight : TEXCOORD1; float2 text : TEXCOORD2; }; struct PS_OUTPUT vector diffuse : COLOR0; 2010-1학기 컴퓨터게임(DirectX)

27 PS_OUTPUT Main(PS_INPUT input) { // zero out members of output
PS_OUTPUT output = (PS_OUTPUT)0; // sample appropriate textures vector b = tex2D(BaseTex, input.base); vector s = tex2D(SpotLightTex, input.spotlight); vector t = tex2D(StringTex, input.text); // combine texel colors vector c = b * s + t; // increase the intensity of the pixel slightly c += 0.1f; 2010-1학기 컴퓨터게임(DirectX)

28 // save the resulting pixel color output.diffuse = c; return output; }
픽셀 셰이더는 먼저 블렌딩하려는 각 텍스처 당 한 개씩의 샘플러 객체를 선언하였으며, 이어 입력과 출력 구조체를 정의. 현재의 픽셀 셰이더는 어떤 컬러 값도 입력받지 않는다는 데 주의해야 함. 이것은 컬러링과 조명에 완전히 텍스처만을 이용하기 때문 BaseTex는 표면의 컬러를 보관하며 SpotLightTex는 라이트 맵을 보관. 픽셀 셰이더는 텍스처들을 조합하여 계산해낸 특정한 한 픽셀의 컬러값을 출력 2010-1학기 컴퓨터게임(DirectX)

29 Main 함수는 tex2D 함수를 이용해 세 텍스처를 샘플링함
c=b*s+t식을 이용해 텍셀 컬러를 결합하고 각 성분에 0.1f를 더하여 픽셀 컬러의 전반적인 강도를 향상시킨 다음, 최종적으로 얻은 결과 픽셀을 저장하고 리턴 2010-1학기 컴퓨터게임(DirectX)

30 이제 애플리케이션 코드를 살펴보면, 다음과 같은 전역 변수를 가지고 있음
IDirect3DPixelShader9* MultiTexPS = 0; ID3DXConstantTable* MultiTexCT = 0; IDirect3DVertexBuffer9* QuadVB = 0; IDirect3DTexture9* BaseTex = 0; IDirect3DTexture9* SpotLightTex = 0; 2010-1학기 컴퓨터게임(DirectX)

31 IDirect3DTexture9* StringTex = 0; D3DXHANDLE BaseTexHandle = 0;
D3DXHANDLE SpotLightTexHandle = 0; D3DXHANDLE StringTexHandle = 0; D3DXCONSTANT_DESC BaseTexDesc; D3DXCONSTANT_DESC SpotLightTexDesc; D3DXCONSTANT_DESC StringTexDesc; 2010-1학기 컴퓨터게임(DirectX)

32 멀티 텍스처링 샘플을 위한 버텍스 구조체는 다음과 같이 정의 struct MultiTexVertex {
MultiTexVertex(float x, float y, float z, float u0, float v0, float u1, float v1, float u2, float v2) _x = x; _y = y; _z = z; _u0 = u0; _v0 = v0; _u1 = u1; _v1 = v1; _u2 = u2, _v2 = v2; } 2010-1학기 컴퓨터게임(DirectX)

33 static const DWORD FVF; };
float _x, _y, _z; float _u0, _v0; float _u1, _v1; float _u2, _v2; static const DWORD FVF; }; const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3; 2010-1학기 컴퓨터게임(DirectX)

34 구조체가 세 세트의 텍스처 좌표를 포함하고 있음을 확인할 것. Setup 함수는 다음과 같은 작업을 수행
사각형을 나타내는 버텍스 버퍼를 채움 픽셀 셰이더를 컴파일 픽셀 셰이더를 만듦 텍스처를 읽어 들임 투영 행렬을 지정하고 조명을 끈다 샘플러 객체의 핸들을 얻음 샘플러 객체의 정보를 얻음 2010-1학기 컴퓨터게임(DirectX)

35 Device->CreateVertexBuffer( 6 * sizeof(MultiTexVertex),
bool Setup() { HRESULT hr = 0; // Create geometry. Device->CreateVertexBuffer( 6 * sizeof(MultiTexVertex), D3DUSAGE_WRITEONLY, MultiTexVertex::FVF, D3DPOOL_MANAGED, &QuadVB, 0); MultiTexVertex* v = 0; QuadVB->Lock(0, 0, (void**)&v, 0); 2010-1학기 컴퓨터게임(DirectX)

36 QuadVB->Unlock(); // Compile shader
v[0] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); v[1] = MultiTexVertex(-10.0f, 10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); v[2] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f); v[3] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); v[4] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f); v[5] = MultiTexVertex( 10.0f, -10.0f, 5.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); QuadVB->Unlock(); // Compile shader 2010-1학기 컴퓨터게임(DirectX)

37 ID3DXBuffer* errorBuffer = 0; hr = D3DXCompileShaderFromFile(
ID3DXBuffer* shader = 0; ID3DXBuffer* errorBuffer = 0; hr = D3DXCompileShaderFromFile( "ps_multitex.txt", 0, "Main", // entry point function name "ps_1_1", D3DXSHADER_DEBUG, &shader, &errorBuffer, &MultiTexCT); // output any error messages 2010-1학기 컴퓨터게임(DirectX)

38 ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
if( errorBuffer ) { ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0); d3d::Release<ID3DXBuffer*>(errorBuffer); } if(FAILED(hr)) ::MessageBox(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0); return false; // Create Pixel Shader 2010-1학기 컴퓨터게임(DirectX)

39 hr = Device->CreatePixelShader(
(DWORD*)shader->GetBufferPointer(), &MultiTexPS); if(FAILED(hr)) { ::MessageBox(0, "CreateVertexShader - FAILED", 0, 0); return false; } d3d::Release<ID3DXBuffer*>(shader); // Load textures. D3DXCreateTextureFromFile(Device, "crate.bmp", &BaseTex); 2010-1학기 컴퓨터게임(DirectX)

40 D3DXCreateTextureFromFile(Device, "spotlight.bmp", &SpotLightTex);
D3DXCreateTextureFromFile(Device, "text.bmp", &StringTex); // Set Projection Matrix D3DXMATRIX P; D3DXMatrixPerspectiveFovLH( &P, D3DX_PI * 0.25f, (float)Width / (float)Height, 1.0f, f); Device->SetTransform(D3DTS_PROJECTION, &P); // Disable lighting. 2010-1학기 컴퓨터게임(DirectX)

41 Device->SetRenderState(D3DRS_LIGHTING, false); // Get Handles
BaseTexHandle = MultiTexCT->GetConstantByName(0, "BaseTex"); SpotLightTexHandle = MultiTexCT->GetConstantByName(0, "SpotLightTex"); StringTexHandle = MultiTexCT->GetConstantByName(0, "StringTex"); // Set constant descriptions: UINT count; 2010-1학기 컴퓨터게임(DirectX)

42 MultiTexCT->GetConstantDesc(BaseTexHandle, &BaseTexDesc, &count);
MultiTexCT->GetConstantDesc(SpotLightTexHandle, &SpotLightTexDesc, &count); MultiTexCT->GetConstantDesc(StringTexHandle, &StringTexDesc, &count); MultiTexCT->SetDefaults(Device); return true; } 2010-1학기 컴퓨터게임(DirectX)

43 bool Display(float timeDelta) { if( Device ) //
// Update the scene: Allow user to rotate around scene. static float angle = (3.0f * D3DX_PI) / 2.0f; static float radius = 20.0f; if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f ) angle -= 0.5f * timeDelta; 2010-1학기 컴퓨터게임(DirectX)

44 if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
angle += 0.5f * timeDelta; if( ::GetAsyncKeyState(VK_UP) & 0x8000f ) radius -= 2.0f * timeDelta; if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f ) radius += 2.0f * timeDelta; D3DXVECTOR3 position( cosf(angle) * radius, 0.0f, sinf(angle) * radius ); D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); D3DXMATRIX V; D3DXMatrixLookAtLH(&V, &position, &target, &up); Device->SetTransform(D3DTS_VIEW, &V); 2010-1학기 컴퓨터게임(DirectX)

45 Device->BeginScene(); Device->SetPixelShader(MultiTexPS);
// Render Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); Device->SetPixelShader(MultiTexPS); Device->SetFVF(MultiTexVertex::FVF); Device->SetStreamSource(0, QuadVB, 0, sizeof(MultiTexVertex)); // base tex Device->SetTexture(BaseTexDesc.RegisterIndex, BaseTex); Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 2010-1학기 컴퓨터게임(DirectX)

46 Device->SetTexture(SpotLightTexDesc.RegisterIndex, SpotLightTex);
Device->SetSamplerState(SpotLightTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(SpotLightTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(SpotLightTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // string tex Device->SetTexture(StringTexDesc.RegisterIndex, StringTex); Device->SetSamplerState(StringTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); Device->SetSamplerState(StringTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 2010-1학기 컴퓨터게임(DirectX)

47 Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
Device->SetSamplerState(StringTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); Device->EndScene(); Device->Present(0, 0, 0, 0); } return true; 이용이 끝난 인터페이스들은 Cleanup 함수에서 모두 해제해야 함 void Cleanup() { d3d::Release<IDirect3DVertexBuffer9*>(QuadVB); 2010-1학기 컴퓨터게임(DirectX)

48 d3d::Release<IDirect3DTexture9*>(BaseTex);
d3d::Release<IDirect3DTexture9*>(SpotLightTex); d3d::Release<IDirect3DTexture9*>(StringTex); d3d::Release<IDirect3DPixelShader9*>(MultiTexPS); d3d::Release<ID3DXConstantTable*>(MultiTexCT); } 2010-1학기 컴퓨터게임(DirectX)

49 실행결과 2010-1학기 컴퓨터게임(DirectX)


Download ppt "제 18 장 픽셀 셰이더의 소개."

Similar presentations


Ads by Google