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)
환경광
확산 반사광