directx shader programming

20
DirectX Shader Programming

Upload: dianne

Post on 15-Jan-2016

117 views

Category:

Documents


1 download

DESCRIPTION

DirectX Shader Programming. Lambert 조명모델의 확장. 지난주에 구현한 프로그램의 단점 조명계산을 하는 과정에서 월드 좌표계의 법선 벡터를 받아오면서 연산을 2 회함 로컬 좌표계에서 계산하는 방법으로 바꿀 수 있다면 ? Normal Vector 의 연산을 로컬좌표계로 바꾸어 보자 float N 에 모델의 Normal 벡터를 대입하면 됨. Lambert 조명 모델의 최적화. 의 경우 바뀔 일이 없음 상수화 가능 환경광과 확산 반사광은 색의 강도만 다름 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: DirectX  Shader  Programming

DirectX Shader Pro-gramming

Page 2: DirectX  Shader  Programming

Lambert 조명모델의 확장

지난주에 구현한 프로그램의 단점 조명계산을 하는 과정에서 월드 좌표계의 법선

벡터를 받아오면서 연산을 2 회함 로컬 좌표계에서 계산하는 방법으로 바꿀 수

있다면 ?▪ Normal Vector 의 연산을 로컬좌표계로 바꾸어 보자

▪ float N 에 모델의 Normal 벡터를 대입하면 됨

Page 3: DirectX  Shader  Programming

Lambert 조명 모델의 최적화

의 경우 바뀔 일이 없음 상수화 가능

환경광과 확산 반사광은 색의 강도만 다름

과 같은 형태로 바꾸는 것도 가능 광원벡터 L 의 w 에 환경광의 강도가

포함되어 있음

kd II

))(*0.13.0(* LNcolorI

Page 4: DirectX  Shader  Programming

Lambert 조명 모델의 최적화

노멀 벡터를 입력받고

4 방향벡터에 x,y,z 에는 빛의 방향을 ,W 값에는 확산광 값을 넣어

메모리사용양과 계산양을 줄임

Page 5: DirectX  Shader  Programming

Phong 반사 모델

강한 빛이 반사된 부분에서 나타나는

하이라이트

Page 6: DirectX  Shader  Programming

Phong 반사 모델

하이라이트는 강한 빛이 닿는 부분에서 생기는 강한 반사광을 의미

반영 반사광 (Specularity, 反影 )

이라고 함

Page 7: DirectX  Shader  Programming

램버트 모델과의 차이점

램버트 모델에서는 반사광을 표현하지

못함

퐁 셰이딩은 반영 반사광을 정확히 표현함

Page 8: DirectX  Shader  Programming

램버트 모델과의 차이점

Page 9: DirectX  Shader  Programming

Phong 반사

Page 10: DirectX  Shader  Programming

Phong 반사의 이해

빛이 물체에서 반사되었을 때 , 시선이 입사 방향과 가까울 수록 반사광이 강하게 보임

즉 , 반사벡터 R 을 구해서R 이 입사벡터 L 과 가까울수록강한 빛을 표현 하면 됨

Page 11: DirectX  Shader  Programming

Phong 반사의 이해

반사 강도 (n) 에 따른 반응 변화는 위와 같음 n 이 0 에 가까울 수록 하이라이트 범위가

넓어짐

Page 12: DirectX  Shader  Programming

Phong 반사의 구현

램버트 확산 조명에서 반영 반사항만 추가하면 됨

카메라의 위치를 EyePos 라 하면 EyePos 에서 정점 V 로 향하는 벡터를 정규화해서 반사 벡터를 계산

시점벡터는 뷰 좌표계의 원점을 사용하면 됨

Page 13: DirectX  Shader  Programming

Phong 반영 반사 공식

nssddaa RLKILNKIKII )()(

램버트 조명

반영 반사광

반사벡터

Page 14: DirectX  Shader  Programming

픽셀 단위의 반영 반사 계산

버텍스 셰이더의 경우에는 폴리곤의 개수에 따라서 하이라이트 표현에 영향을 많이 받음

Page 15: DirectX  Shader  Programming

픽셀 단위의 반영 반사 계산

픽셀 셰이더는 법선 벡터 등의 입력변수를 마음대로 다룰 수 없음 버텍스 셰이더에서 픽셀 셰이더로 값을 넘겨줄 때 입력 변수의 값을 함께 넘겨주는 방법을 사용

주로 텍스쳐 좌표를 입력 변수로 사용함 벡터로 변경이 가능하기 때문

Page 16: DirectX  Shader  Programming

버텍스 셰이더의 아웃풋 활용

struct VS_OUTPUT

{

float4 Pos : POSI-

TION;

float4 Color : COLOR0;

float3 N : TEXCOORD0;

float3 Eye : TEXCOORD1;

};텍스쳐좌표를 법선 벡터와 시점 벡터로 활용

Page 17: DirectX  Shader  Programming

VS 의 Output 수정

// -------------------------------------------------------------// 장면렌더// -------------------------------------------------------------VS_OUTPUT VS( float4 Pos : POSITION, // 로컬위치좌표 float4 Normal : NORMAL // 법선벡터){

VS_OUTPUT Out = (VS_OUTPUT)0; // 출력데이터

// 좌표변환Out.Pos = mul(Pos, mWVP);

// 정점색float amb = -vLightDir.w; // 환경광의강도

float3 eye = normalize(vEyePos - Pos.xyz);float3 L = -vLightDir; // 로컬좌표계에서의광원벡터float3 N = Normal.xyz;float3 R = -eye + 2.0f*dot(N,eye)*N; // 반사벡터

Out.Color = vColor * max(amb, dot(Normal, -vLightDir)) + pow(max(0,dot(L, R)), 10);

Out.N = N;Out.Eye = R;return Out;

}

Page 18: DirectX  Shader  Programming

픽셀 셰이더 수정

float4 PS(VS_OUTPUT In) : COLOR{ float3 L = -vLightDir.xyz;float3 R = In.Eye;float3 N = In.N;

return In.Color * max(.3, dot(N, -vLightDir)) + pow(max(0,dot(L, R)), 10);;

}

Page 19: DirectX  Shader  Programming

// -------------------------------------------------------------// 장면렌더// -------------------------------------------------------------VS_OUTPUT VS( float4 Pos : POSITION, // 로컬위치좌표 float4 Normal : NORMAL // 법선벡터){

VS_OUTPUT Out = (VS_OUTPUT)0; // 출력데이터

// 좌표변환Out.Pos = mul(Pos, mWVP);

// 정점색float amb = -vLightDir.w; // 환경광의강도

float3 eye = normalize(vEyePos - Pos.xyz);float3 L = -vLightDir; // 로컬좌표계에서의광원벡터float3 N = Normal.xyz;float3 R = -eye + 2.0f*dot(N,eye)*N; // 반사벡터

Out.Color = vColor * max(amb, dot(Normal, -vLightDir)) + pow(max(0,dot(L, R)), 10);

Out.N = N;Out.Eye = R;return Out;

}// -------------------------------------------------------------float4 PS(VS_OUTPUT In) : COLOR{

float3 L = -vLightDir.xyz;float3 R = In.Eye;float3 N = In.N;

return In.Color * max(.3, dot(N, -vLightDir)) + pow(max(0,dot(L, R)), 10);;

}

Page 20: DirectX  Shader  Programming

다음 시간에 할 것

본격적인 렌더링 테크닉을 학습 할 것임 카툰 렌더링을 할 예정 카툰 렌더링에 사용할 모델 (.x 파일 ) 을

구해서모델을 화면에 띄워 올 것 단 , 셰이더를 바로 사용할 수 있게 실습시간에

활용했던 셰이더를 활용할 것 수행평가 참고 자료 : 실습 예제 + DirectX Tutorial 6