23
제 3 제제 1.High Level Shader Language 2.제제제 제제 제제

DirectX Shader Programming

  • Upload
    gianna

  • View
    216

  • Download
    2

Embed Size (px)

DESCRIPTION

제 3 주차 High Level Shader Language 램버트 확산 조명. DirectX Shader Programming. High Level Shader Language. High Level Shader Language. C 언어와 유사한 문법 구조 컴파일형 언어 내부 혹은 외부에서 컴파일 과정을 거쳐야 함 정점 셰이더와 픽셀 셰이더 지원 명령어의 차이가 적어서 변환이 편리. VS : PS. HLSL 로 작성한 셰이더는 약간의 수정만으로 VS 와 PS 사이에서 변환 가능 함 - PowerPoint PPT Presentation

Citation preview

Page 1: DirectX  Shader  Programming

제 3 주차 1.High Level Shader Language2.램버트 확산 조명

Page 2: DirectX  Shader  Programming
Page 3: DirectX  Shader  Programming

C 언어와 유사한 문법 구조 컴파일형 언어

내부 혹은 외부에서 컴파일 과정을 거쳐야 함 정점 셰이더와 픽셀 셰이더 지원

명령어의 차이가 적어서 변환이 편리

Page 4: DirectX  Shader  Programming

HLSL 로 작성한 셰이더는 약간의 수정만으로 VS 와 PS 사이에서 변환 가능함

Vertex Shader 속도가 빠름 정확도를 높이려면 ? 하이폴리곤 모델 사용

Pixel Shader 정확도가 높음 속도가 상대적으로 느림

Page 5: DirectX  Shader  Programming

HSLS 은 이펙트 파일로 작성

이펙트 파일의 사용법 소스원본

▪ D3DXCreateEffectFrom

File

Fxc.exe 활용

▪ D3DXCreateEffect

이펙트 파일xxxxx.fx

이펙트 파일xxxxx.fx

어플리케이션

오브젝트 파일(xxxxxx.obj)오브젝트 파일(xxxxxx.obj)

Page 6: DirectX  Shader  Programming
Page 7: DirectX  Shader  Programming

좌표 변환에 사용될 변환행렬 float4x4

모델의 색상 텍스쳐

texture 샘플러 오브젝트

sampler 등등

Page 8: DirectX  Shader  Programming

// 전역변수 선언float4x4 mMWP; // 로컬 좌표 변환// 텍스쳐texture Tex; // 텍스쳐 정보

sample Samp = sampler_state{Texture = <Tex>;MinFilter = LINEAR; MagFilter = LINEAR;MipFilter = NONE;AddressU = CLAMP; AddressV = CLAMP;

};

Page 9: DirectX  Shader  Programming

struct VS_OUTPUT

{

float4 Pos : POSITION

float2 TexCoord : TEXCOORD0

}시멘틱스 : 출력레지스터에 대응

POSITION oPOS TEXCOORD0 oT0

다른 용도로도 사용 가능

다른 용도로도 사용 가능

Page 10: DirectX  Shader  Programming

VS_OUTPUT VS(float4 Pos : POSITIONfloat2 TexCoord : TEXCOORD0

){VS_OUTPUT Out = (VS_OUTPUT) = 0;Out.Pos = mul(Pos, mWVP);Out.TexCoord = Tex;

return Out;}

Page 11: DirectX  Shader  Programming

float4 PS( VS_OUTPUT In ) : COLOR

{

return tex2D( Samp, In.TexCoord );

}

Tex2D 샘플러에 등록되어 있는 텍스쳐를 읽어옴

Page 12: DirectX  Shader  Programming

tenique TShader

{

pass P0

{

VertexShader = compile vs_1_1 VS();

PixelShader = compile ps_1_1 PS();

}

}

Page 13: DirectX  Shader  Programming

HLSL 로 작성한 파일을 D3D

어플리케이션에서 사용하기 위함 LPD3DXEFFECT

셰이더 D3DXHANDLE

HLSL 에 정의한 함수 , 변수에 접근하기 위한 핸들러

Page 14: DirectX  Shader  Programming

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 가 리턴되고 , 아니면 에러넘버가 리턴됨

Page 15: DirectX  Shader  Programming

D3DXCreateEffectFromFile 로 이펙트를 컴파일 GetTechniqueByName()

이펙트 파일 내부의 테크닉 핸들을 얻어옴 GetParameterByName()

테크닉 내부의 변수를 얻어옴

Technique = Effect->GetTechniqueByName( “TShader”);

WVP = Effect->getParameterByName(NULL, “mMVP”);

Page 16: DirectX  Shader  Programming

이펙트도 하나의 DirectX 객체이기 때문에 디바이스를 잃거나 , 리셋이 되는 상황에 대한 처리를 해주어야 한다 .

텍스쳐나 버텍스들도 마찬가지임

Page 17: DirectX  Shader  Programming

이펙트 설정 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();

Page 18: DirectX  Shader  Programming

2D 이미지를 3D 로 착각하게 만드는 것 빛이 비치는 쪽은 밝고 ,

비치지 않는 쪽은 어두움

Page 19: DirectX  Shader  Programming

광원에서 나오는 빛의 방향과 면의 수직방향이 이루는 각도 =

cos

1

1

Page 20: DirectX  Shader  Programming

모든 방향에 대하여 같은 강도로 산란됨= 빛의 강도가 강하면 밝게 보임 램버트의 코사인 법칙 (Lamber`s Cosine

law) 물체 표면에서 반사하는 빛의 휘도는 입사벡터 L 과 법선벡터 N

의 각도의 코사인에 비례한다 .

빛의 강도를 Id 이고 물체의 색은 Kd, 입사각일 때 다음 공식이 성립함

)(cos LNKIKII dddd

Page 21: DirectX  Shader  Programming

실제 세계의 물체는 빛을 반사할 때 우리 눈 뿐만 아니라 다른 방향으로도 반사시킴

그 빛이 다른 물체에 영향을 미치는 것

aa KII

Page 22: DirectX  Shader  Programming

램버트의 코사인 법칙에 의한 확산 조명 + 환경광 라이팅 = 램버트 조명 모델

)( LNKIKII ddaa

환경광 확산 반사광

Page 23: DirectX  Shader  Programming