directx shader programming
DESCRIPTION
DirectX Shader Programming. Lambert 조명모델의 확장. 지난주에 구현한 프로그램의 단점 조명계산을 하는 과정에서 월드 좌표계의 법선 벡터를 받아오면서 연산을 2 회함 로컬 좌표계에서 계산하는 방법으로 바꿀 수 있다면 ? Normal Vector 의 연산을 로컬좌표계로 바꾸어 보자 float N 에 모델의 Normal 벡터를 대입하면 됨. Lambert 조명 모델의 최적화. 의 경우 바뀔 일이 없음 상수화 가능 환경광과 확산 반사광은 색의 강도만 다름 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/1.jpg)
DirectX Shader Pro-gramming
![Page 2: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/2.jpg)
Lambert 조명모델의 확장
지난주에 구현한 프로그램의 단점 조명계산을 하는 과정에서 월드 좌표계의 법선
벡터를 받아오면서 연산을 2 회함 로컬 좌표계에서 계산하는 방법으로 바꿀 수
있다면 ?▪ Normal Vector 의 연산을 로컬좌표계로 바꾸어 보자
▪ float N 에 모델의 Normal 벡터를 대입하면 됨
![Page 3: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/3.jpg)
Lambert 조명 모델의 최적화
의 경우 바뀔 일이 없음 상수화 가능
환경광과 확산 반사광은 색의 강도만 다름
과 같은 형태로 바꾸는 것도 가능 광원벡터 L 의 w 에 환경광의 강도가
포함되어 있음
kd II
))(*0.13.0(* LNcolorI
![Page 4: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/4.jpg)
Lambert 조명 모델의 최적화
노멀 벡터를 입력받고
4 방향벡터에 x,y,z 에는 빛의 방향을 ,W 값에는 확산광 값을 넣어
메모리사용양과 계산양을 줄임
![Page 5: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/5.jpg)
Phong 반사 모델
강한 빛이 반사된 부분에서 나타나는
하이라이트
![Page 6: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/6.jpg)
Phong 반사 모델
하이라이트는 강한 빛이 닿는 부분에서 생기는 강한 반사광을 의미
반영 반사광 (Specularity, 反影 )
이라고 함
![Page 7: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/7.jpg)
램버트 모델과의 차이점
램버트 모델에서는 반사광을 표현하지
못함
퐁 셰이딩은 반영 반사광을 정확히 표현함
![Page 8: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/8.jpg)
램버트 모델과의 차이점
![Page 9: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/9.jpg)
Phong 반사
![Page 10: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/10.jpg)
Phong 반사의 이해
빛이 물체에서 반사되었을 때 , 시선이 입사 방향과 가까울 수록 반사광이 강하게 보임
즉 , 반사벡터 R 을 구해서R 이 입사벡터 L 과 가까울수록강한 빛을 표현 하면 됨
![Page 11: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/11.jpg)
Phong 반사의 이해
반사 강도 (n) 에 따른 반응 변화는 위와 같음 n 이 0 에 가까울 수록 하이라이트 범위가
넓어짐
![Page 12: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/12.jpg)
Phong 반사의 구현
램버트 확산 조명에서 반영 반사항만 추가하면 됨
카메라의 위치를 EyePos 라 하면 EyePos 에서 정점 V 로 향하는 벡터를 정규화해서 반사 벡터를 계산
시점벡터는 뷰 좌표계의 원점을 사용하면 됨
![Page 13: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/13.jpg)
Phong 반영 반사 공식
nssddaa RLKILNKIKII )()(
램버트 조명
반영 반사광
반사벡터
![Page 14: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/14.jpg)
픽셀 단위의 반영 반사 계산
버텍스 셰이더의 경우에는 폴리곤의 개수에 따라서 하이라이트 표현에 영향을 많이 받음
![Page 15: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/15.jpg)
픽셀 단위의 반영 반사 계산
픽셀 셰이더는 법선 벡터 등의 입력변수를 마음대로 다룰 수 없음 버텍스 셰이더에서 픽셀 셰이더로 값을 넘겨줄 때 입력 변수의 값을 함께 넘겨주는 방법을 사용
주로 텍스쳐 좌표를 입력 변수로 사용함 벡터로 변경이 가능하기 때문
![Page 16: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/16.jpg)
버텍스 셰이더의 아웃풋 활용
struct VS_OUTPUT
{
float4 Pos : POSI-
TION;
float4 Color : COLOR0;
float3 N : TEXCOORD0;
float3 Eye : TEXCOORD1;
};텍스쳐좌표를 법선 벡터와 시점 벡터로 활용
![Page 17: DirectX Shader Programming](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/18.jpg)
픽셀 셰이더 수정
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](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/19.jpg)
// -------------------------------------------------------------// 장면렌더// -------------------------------------------------------------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](https://reader036.vdocuments.net/reader036/viewer/2022081417/56814932550346895db67601/html5/thumbnails/20.jpg)
다음 시간에 할 것
본격적인 렌더링 테크닉을 학습 할 것임 카툰 렌더링을 할 예정 카툰 렌더링에 사용할 모델 (.x 파일 ) 을
구해서모델을 화면에 띄워 올 것 단 , 셰이더를 바로 사용할 수 있게 실습시간에
활용했던 셰이더를 활용할 것 수행평가 참고 자료 : 실습 예제 + DirectX Tutorial 6