이펙트 파일로

Download Report

Transcript 이펙트 파일로

제 3 주차
1. High Level Shader Language
2. 램버트 확산 조명
DirectX의 버전이 높아짐
셰이더 확장
복잡도 증가
High Level Shader Language 등장

C언어와 유사한 문법 구조

컴파일형 언어
 내부 혹은 외부에서 컴파일 과정을 거쳐야 함

정점 셰이더와 픽셀 셰이더 지원
 명령어의 차이가 적어서 변환이 편리


HLSL로 작성한 셰이더는 약간의 수정만으로
VS와 PS 사이에서 변환 가능함
Vertex Shader
 속도가 빠름
 정확도를 높이려면?  하이폴리곤 모델 사용

Pixel Shader
 정확도가 높음
 속도가 상대적으로 느림
이펙트 파일
xxxxx.fx

HSLS은 이펙트 파일로 작성

이펙트 파일의 사용법
어플리케이션
 소스원본
▪ D3DXCreateEffectFromFile
 Fxc.exe 활용
▪ D3DXCreateEffect
오브젝트 파일
(xxxxxx.obj)
전역 변수 선언
정점 셰이더 출력에
필요한 구조체 선언
정점 셰이더
픽셀 셰이더
테크닉

좌표 변환에 사용될 변환행렬
 float4x4
모델의 색상
 텍스쳐

 texture

샘플러 오브젝트
 sampler

등등
//전역변수 선언
float4x4
mMWP; //로컬 좌표 변환
//텍스쳐
texture
Tex; // 텍스쳐 정보
sample Samp
{
Texture =
MinFilter
MipFilter
AddressU
};
= sampler_state
<Tex>;
= LINEAR; MagFilter = LINEAR;
= NONE;
= CLAMP; AddressV = CLAMP;
struct VS_OUTPUT
다른 용도로도
사용 가능
{
float4 Pos
: POSITION
float2 TexCoord
: TEXCOORD0
}
시멘틱스 : 출력레지스터에 대응
POSITION  oPOS
TEXCOORD0  oT0
VS_OUTPUT VS(
float4 Pos
: POSITION
float2 TexCoord
: TEXCOORD0
){
VS_OUTPUT Out = (VS_OUTPUT) = 0;
Out.Pos = mul(Pos, mWVP);
Out.TexCoord = Tex;
return Out;
}
float4 PS( VS_OUTPUT In ) : COLOR
{
return tex2D( Samp, In.TexCoord );
}

Tex2D
 샘플러에 등록되어 있는 텍스쳐를 읽어옴
tenique TShader
{
pass P0
{
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_1_1 PS();
}
}

HLSL로 작성한 파일을 D3D 어플리케이션에서
사용하기 위함

LPD3DXEFFECT
 셰이더

D3DXHANDLE
 HLSL에 정의한 함수, 변수에 접근하기 위한 핸들러
HRESULT D3DXCreateEffectFromFile(
LPDIRECT3DDEVICE9 pDevice,
// 디바이스
LPCTSTR pSrcFile,
// 이펙트 파일
CONST D3DXMACRO * pDefines,
// 전처리기 옵션 (null)
LPD3DXINCLUDE pInclude,
// 옵션인터페이스 (null)
DWORD Flags,
// D3DXSHADER 식별용
LPD3DXEFFECTPOOL pPool,
// 이펙트풀
LPD3DXEFFECT * ppEffect,
// 셰이더 변수
LPD3DXBUFFER * ppCompilationErrors // 에러를 저장할 곳
);

적색을 제외한 나머지 옵션은 NULL을 넣어주면 OK

함수가 제대로 실행되면 S_OK 가 리턴되고, 아니면 에러넘버가 리턴됨

D3DXCreateEffectFromFile로 이펙트를 컴파일

GetTechniqueByName()
 이펙트 파일 내부의 테크닉 핸들을 얻어옴

GetParameterByName()
 테크닉 내부의 변수를 얻어옴
Technique = Effect->GetTechniqueByName( “TShader”);
WVP = Effect->getParameterByName(NULL, “mMVP”);

이펙트도 하나의 DirectX 객체이기 때문에
디바이스를 잃거나, 리셋이 되는 상황에
대한 처리를 해주어야 한다.

텍스쳐나 버텍스들도 마찬가지임


이펙트 설정

Effect->SetTechnique( Technique );

Effect->Begin( NULL, 0 );

Effect->Pass (0);
셰이더 상수 설정

D3DXMATRIX m = world * view * proj;

Effect->SetMatrix( WVP, &m );
▪



어셈 셰이더와 달리 전치행렬을 쓰지 않아도 OK
Effect->SetTexture(“Tex”, Mesh->m_Ptextures[0]);
실제 렌더링

pd3dDevice->SetVertexDeclaration(m_pDecl);

Mesh->Render(pd3dDevice);
렌더링 종료

Effect->End();

2D 이미지를 3D로 착각하게 만드는 것

빛이 비치는 쪽은 밝고,
비치지 않는 쪽은 어두움

광원에서 나오는 빛의 방향과
면의 수직방향이 이루는 각도 = 


1
cos 
1

모든 방향에 대하여 같은 강도로 산란됨

= 빛의 강도가 강하면 밝게 보임

램버트의 코사인 법칙(Lamber`s Cosine law)
 물체 표면에서 반사하는 빛의 휘도는 입사벡터 L과 법선벡터 N
의 각도의 코사인에 비례한다.
 빛의 강도를 Id이고 물체의 색은 Kd, 입사각
일 때 다음 공식이 성립함

I  I d  Kd  cos  I d  K d  ( N  L)

실제 세계의 물체는 빛을 반사할 때 우리
눈 뿐만 아니라 다른 방향으로도 반사시킴

그 빛이 다른 물체에 영향을 미치는 것
I  I a  Ka

램버트의 코사인 법칙에 의한 확산 조명 +
환경광 라이팅 = 램버트 조명 모델
I  I a  K a  I d  K d  ( N  L)
환경광
확산 반사광