250 likes | 735 Vues
제 3 주차 High Level Shader Language 램버트 확산 조명. DirectX Shader Programming. High Level Shader Language. High Level Shader Language. C 언어와 유사한 문법 구조 컴파일형 언어 내부 혹은 외부에서 컴파일 과정을 거쳐야 함 정점 셰이더와 픽셀 셰이더 지원 명령어의 차이가 적어서 변환이 편리. VS : PS. HLSL 로 작성한 셰이더는 약간의 수정만으로 VS 와 PS 사이에서 변환 가능 함
E N D
제 3 주차 High Level Shader Language 램버트 확산 조명 DirectX Shader Programming
High Level Shader Language • C언어와 유사한 문법 구조 • 컴파일형 언어 • 내부 혹은 외부에서 컴파일 과정을 거쳐야 함 • 정점 셰이더와 픽셀 셰이더 지원 • 명령어의 차이가 적어서 변환이 편리
VS : PS • HLSL로 작성한 셰이더는 약간의 수정만으로 VS와 PS 사이에서 변환 가능함 • Vertex Shader • 속도가 빠름 • 정확도를 높이려면? 하이폴리곤 모델 사용 • Pixel Shader • 정확도가 높음 • 속도가 상대적으로 느림
Effect File • HSLS은 이펙트 파일로 작성 • 이펙트 파일의 사용법 • 소스원본 • D3DXCreateEffectFromFile • Fxc.exe 활용 • D3DXCreateEffect 어플리케이션 이펙트 파일 xxxxx.fx 오브젝트 파일(xxxxxx.obj)
전역 변수의 선언 • 좌표 변환에 사용될 변환행렬 • float4x4 • 모델의 색상 • 텍스쳐 • texture • 샘플러 오브젝트 • sampler • 등등
전역 변수의 선언 //전역변수 선언 float4x4 mMWP; //로컬 좌표 변환 //텍스쳐 texture Tex; // 텍스쳐 정보 sample Samp = sampler_state { Texture = <Tex>; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = 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(); } }
Handling effect file • HLSL로 작성한 파일을 D3D 어플리케이션에서 사용하기 위함 • LPD3DXEFFECT • 셰이더 • D3DXHANDLE • HLSL에 정의한 함수, 변수에 접근하기 위한 핸들러
Create Effect #1 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가 리턴되고, 아니면 에러넘버가 리턴됨
Create Effect #2 • D3DXCreateEffectFromFile로 이펙트를 컴파일 • GetTechniqueByName() • 이펙트 파일 내부의 테크닉 핸들을 얻어옴 • GetParameterByName() • 테크닉 내부의 변수를 얻어옴 Technique = Effect->GetTechniqueByName( “TShader”); WVP = Effect->getParameterByName(NULL, “mMVP”);
Effect Recovery • 이펙트도 하나의 DirectX 객체이기 때문에 디바이스를 잃거나, 리셋이 되는 상황에 대한 처리를 해주어야 한다. • 텍스쳐나버텍스들도 마찬가지임
Rendering From Effect File • 이펙트 설정 • 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
빛의 반사각도와 강도 • 모든 방향에 대하여 같은 강도로 산란됨 • = 빛의 강도가 강하면 밝게 보임 • 램버트의 코사인 법칙(Lamber`s Cosine law) • 물체표면에서 반사하는 빛의 휘도는 입사벡터 L과 법선벡터 N의 각도의 코사인에 비례한다. • 빛의 강도를 Id이고물체의 색은 Kd, 입사각일 때 다음 공식이 성립함
환경광 • 실제 세계의 물체는 빛을 반사할 때 우리 눈 뿐만 아니라 다른 방향으로도 반사시킴 • 그 빛이 다른 물체에 영향을 미치는 것
램버트 조명 모델 • 램버트의 코사인 법칙에 의한 확산 조명 + 환경광 라이팅 = 램버트 조명 모델 환경광 확산 반사광