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

Slides:



Advertisements
Similar presentations
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Advertisements

제17장 버텍스 셰이더의 소개.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
Ch7. 블렌딩 “현재 래스터라이즈 과정에 있는 픽셀과 같은 위치에 있는 이전의 픽셀을 서로 섞는(조합)하는 테크닉!”
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
제12장 유연한 카메라 클래스 만들기 학기 컴퓨터게임(DirectX).
제13장 기본적인 지형 렌더링 학기 컴퓨터게임(DirectX).
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
CUDA Setting : Install & Compile
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Chaper 19 이펙트 프레임웍.
제6장 텍스처링 학기 컴퓨터게임(DirectX).
제8장 스텐실.
제 14 장 파티클 시스템.
12장 유연한 카메라 클래스 만들기 한성대학교 멀티미디어공학과 게임 프로그래밍-I 강의노트
Visual Basic .NET 처음 사용하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
26. 매크로와 전처리기.
제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현
제5장 조명 학기 컴퓨터게임(DIrectX).
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
TCP/IP Socket Programming…
11장. 1차원 배열.
제 16 장 고수준 셰이딩 언어 소개.
CHAP 12. 리소스와 보안.
13. 연산자 오버로딩.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
11장 메쉬 파트II 학기 컴퓨터게임(DirectX).
2강_첫번째 안드로이드 프로젝트 에뮬레이터(AVD) 만들기 처음 만들어 보는 프로젝트 전체적인 구성 살펴보기
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
( Windows Service Application Debugging )
OpenCV 설정 2.21 만든이 딩딩.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
13주 실습강의 학기, 소프트웨어 설계 및 실험(Ⅰ).
Flow Diagram IV While.
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
함수, 모듈.
9 브라우저 객체 모델.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
7 생성자 함수.
6 객체.
BoardGame 보드게임 따라가기.
20 XMLHttpRequest.
Presentation transcript:

제 18 장 픽셀 셰이더의 소개

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

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

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

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

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

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)

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)

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

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)

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)

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

출력에서 픽셀 셰이더는 다음과 같이 각 픽셀 당 계산된 하나의 컬러 값을 출력 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)

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

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

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

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

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

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

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

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

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)

//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)

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

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

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)

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)

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

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

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

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

멀티 텍스처링 샘플을 위한 버텍스 구조체는 다음과 같이 정의 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)

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)

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

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)

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)

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)

::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)

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)

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, 1000.0f); Device->SetTransform(D3DTS_PROJECTION, &P); // Disable lighting. 2010-1학기 컴퓨터게임(DirectX)

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)

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

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)

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)

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)

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)

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)

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

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