SlideShare a Scribd company logo
1 of 18
텍스트
셰이더가 뭐에요?
외계어 ㄷㄷ 수학 ㄷㄷ 근데 해보고 싶어!
셰이더가 뭔데 그래요
컴퓨터 그래픽스 분야에서 셰이
더(shader)는 소프트웨어 명령
의 집합으로 주로 그래픽 하드웨
어의 렌더링 효과를 계산하는 데
쓰인다.
셰이더는 그래픽 처리 장치
(GPU)의 프로그래밍이 가능한
렌더링 파이프라인을 프로그래
밍하는 데 쓰인다.
요약하면 데이터 쪼가리를 모니
터 밖으로 꺼내주는 코드
데이터에서 모니터까지
공간상의 좌표 화면 좌표
좌표계 변
환
픽셀 배열
Rasterize
데이터에서 모니터까지
공간상의 좌표 화면 좌표
좌표계 변
환
픽셀 배열
Rasterize
각각의 정점에 대한 계산 :
이 정점은 화면 어디에 위치해야 할까?
빛을 어느 방향에서 얼만큼 받을까?
각각의 픽셀에
대한 계산 :
이 픽셀은
무슨 색일까?
데이터에서 모니터까지
공간상의 좌표 화면 좌표
좌표계 변
환
픽셀 배열
Rasterize
각각의 정점에 대한 계산 :
이 정점은 화면 어디에 위치해야 할까?
빛을 어느 방향에서 얼만큼 받을까?
각각의 픽셀에
대한 계산 :
이 픽셀은
무슨 색일까?
정점 셰이더 픽셀 셰이더
정점 셰이더에서 픽셀 셰이
더로
정점별 계산 결과물을
위치관계에 따라 선형보
간해서 픽셀 셰이더로
전달
색상 데이터를 전달한다
면 :
정점 1은 흰색,
정점 3은 검은색
-> 가운데 픽셀 셰이더
에게는 회색이 전달된다
!
3
여기는
회색!
실제 코드를 봅시다
유니티의 ShaderLab 코드 안
에 nVidia의 Cg 코드가 삽입된
형태
그래서 외계어처럼 보였었구나
....
이만큼 Cg 코드
요 바깥은 ShaderLab 코드
실제 코드를 봅시다
정점 셰이더 : 정점의 좌표를
화면좌표계로 옮겨라
픽셀 셰이더 :
빨갛게 칠해라
결과물
광원효과가 없으니 밋밋하
죠
정반사 / Specular reflection
입사한 빛이 한 방향으
로
반사된다고 가정
보는 방향에 따라 밝게
보이는 위치가 다르다!
시선의 방향과 반사광의
방향을 내적하여 구할
수 있다
난반사 / Diffuse reflection
입사한 빛이 모든 방향
으로
균일하게 반사된다고 가
정
밝은 부분은 어느 방향
에서 봐도 밝다!
표면의 방향과 빛의 방
향을
내적하여 구할 수 있다
정점마다 빛의 반사 계산하
기
카메라의 방향벡터
(World 좌표계)
광선의 방향벡터
(World 좌표계)
정점의 수직벡터
(World 좌표계)
정반사 (0~1)
난반사 (0~1)
(Per-Vertex Diffuse+Specular shading)
밝기 텍스쳐
픽셀 색상
정점 셰이더 픽셀 셰이더
픽셀의 수직벡
터
픽셀마다 빛의 반사 계산하
기
카메라의 방향벡터
(World 좌표계)
광선의 방향벡터
(World 좌표계)
정점의 수직벡터
(World 좌표계)
정반사 (0~1)
난반사 (0~1)
(Per-Pixel Diffuse+Specular shading)
밝기 텍스쳐
픽셀 색상
정점 셰이더 픽셀 셰이더
노멀 맵
범프 맵
스페큘러
맵
X
정점 계산법과 픽셀 계산법
어느 단계에서 계산할 것
인가?
정점에 대해서만 계산하면
계산량이 대폭 줄어들지만
정확도 역시 부족하다
픽셀별 계산을 하면 픽셀
별로 보간된 수직방향을
사용하며, 노멀맵이나 스
페큘러 맵 등을 사용할 수
있다
예시 :
간단한 정점
난반사 셰이딩
Per-Vertex
Diffuse
Shading
#include "UnityCG.cginc"
uniform float4 _LightColor0;
// color of light source (from "Lighting.cginc")
uniform float4 _Color; // define shader property for shaders
struct vertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 col : COLOR;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
// multiplication with unity_Scale.w is unnecessary
// because we normalize transformed vectors
float3 normalDirection = normalize(
mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);
float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
float3 diffuseReflection = _LightColor0.rgb * _Color.rgb
* max(0.0, dot(normalDirection, lightDirection));
output.col = float4(diffuseReflection, 1.0);
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR
{
return input.col;
}
정점 셰이더에서
입력받을 데이터 선언
정점 셰이더에서 픽셀 셰이
더로 보낼 데이터 선언
정점 라이팅 셰이더이므로
픽셀 셰이더는 그냥 입력받은 색상
값을 그대로 리턴
예시 :
간단한 정점
난반사 셰이딩
Per-Vertex
Diffuse
Shading
vertexOutput vert(vertexInput input)
{
vertexOutput output;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
// multiplication with unity_Scale.w is unnecessary
// because we normalize transformed vectors
float3 normalDirection = normalize(
mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);
float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
float3 diffuseReflection = _LightColor0.rgb * _Color.rgb
* max(0.0, dot(normalDirection, lightDirection));
output.col = float4(diffuseReflection, 1.0);
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
정점의 수직 방향과 빛의 방향을
월드 좌표계에서 정규화하여 나타냄
정점의 수직 방향과 빛의 방향
을
내적하여 난반사량을 구함
반사량과 정점 위치를 리턴
정리
정점 셰이더는 정점별 계산을 하고,
픽셀 셰이더는 픽셀별 계산을 한다
정반사는 보는 각도에 따라 밝은 부위가 변하고,
난반사는 보는 각도에 상관없이 밝은 부위가 일정하다
정점 셰이더 라이팅은 가볍고,
픽셀 셰이더 라이팅은 정확하다

More Related Content

What's hot

2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링Sukwoo Lee
 
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기동석 김
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
3D 게임 그래픽스의 이해
3D 게임 그래픽스의 이해3D 게임 그래픽스의 이해
3D 게임 그래픽스의 이해ByungChun2
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)MinGeun Park
 
이펙트 쉐이더 1강 - Shader 기초 개념
이펙트 쉐이더 1강 - Shader 기초 개념이펙트 쉐이더 1강 - Shader 기초 개념
이펙트 쉐이더 1강 - Shader 기초 개념Jihoo Oh
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근MinGeun Park
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑MinGeun Park
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현민웅 이
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우Sukwoo Lee
 
Screen space reflection
Screen space reflectionScreen space reflection
Screen space reflectionBongseok Cho
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더동석 김
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료MinGeun Park
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해tartist
 
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4동석 김
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자MoonLightMS
 
PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3Jooyoung Yi
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...JP Lee
 

What's hot (20)

2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링
 
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
3D 게임 그래픽스의 이해
3D 게임 그래픽스의 이해3D 게임 그래픽스의 이해
3D 게임 그래픽스의 이해
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)
 
이펙트 쉐이더 1강 - Shader 기초 개념
이펙트 쉐이더 1강 - Shader 기초 개념이펙트 쉐이더 1강 - Shader 기초 개념
이펙트 쉐이더 1강 - Shader 기초 개념
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
Screen space reflection
Screen space reflectionScreen space reflection
Screen space reflection
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해
 
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자
 
PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
 

Similar to 셰이더가 뭐에요?

[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소강 민우
 
Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01SangYun Yi
 
컴퓨터 그래픽스 2015-2019년 출석수업대체시험
컴퓨터 그래픽스 2015-2019년 출석수업대체시험컴퓨터 그래픽스 2015-2019년 출석수업대체시험
컴퓨터 그래픽스 2015-2019년 출석수업대체시험Lee Sang-Ho
 
Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow MapsBongseok Cho
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shadingMinGeun Park
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2MinGeun Park
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone ProgrammingYoung Oh Jeong
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬현찬 양
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑MoonLightMS
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)해강
 
파이어몽키 3D 애플리케이션 만들기
파이어몽키 3D 애플리케이션 만들기파이어몽키 3D 애플리케이션 만들기
파이어몽키 3D 애플리케이션 만들기Devgear
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow MappingSukwoo Lee
 
2015.12.10 defferd renderring_
2015.12.10 defferd renderring_2015.12.10 defferd renderring_
2015.12.10 defferd renderring_재현 최
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)Sukwoo Lee
 
Learning Less is More - 6D Camera Localization via 3D Surface Regression
Learning Less is More - 6D Camera Localization via 3D Surface RegressionLearning Less is More - 6D Camera Localization via 3D Surface Regression
Learning Less is More - 6D Camera Localization via 3D Surface RegressionBrian Younggun Cho
 
셰이더 만들기 실습
셰이더 만들기 실습셰이더 만들기 실습
셰이더 만들기 실습Jungsoo Park
 

Similar to 셰이더가 뭐에요? (20)

[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
 
Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01
 
컴퓨터 그래픽스 2015-2019년 출석수업대체시험
컴퓨터 그래픽스 2015-2019년 출석수업대체시험컴퓨터 그래픽스 2015-2019년 출석수업대체시험
컴퓨터 그래픽스 2015-2019년 출석수업대체시험
 
Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow Maps
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shading
 
[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2[박민근] 3 d렌더링 옵티마이징_2
[박민근] 3 d렌더링 옵티마이징_2
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone Programming
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)
 
파이어몽키 3D 애플리케이션 만들기
파이어몽키 3D 애플리케이션 만들기파이어몽키 3D 애플리케이션 만들기
파이어몽키 3D 애플리케이션 만들기
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow Mapping
 
2015.12.10 defferd renderring_
2015.12.10 defferd renderring_2015.12.10 defferd renderring_
2015.12.10 defferd renderring_
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
 
Learning Less is More - 6D Camera Localization via 3D Surface Regression
Learning Less is More - 6D Camera Localization via 3D Surface RegressionLearning Less is More - 6D Camera Localization via 3D Surface Regression
Learning Less is More - 6D Camera Localization via 3D Surface Regression
 
셰이더 만들기 실습
셰이더 만들기 실습셰이더 만들기 실습
셰이더 만들기 실습
 

More from Jungsoo Park

유니티 애니메이터 FSM으로 활용하기
유니티 애니메이터 FSM으로 활용하기유니티 애니메이터 FSM으로 활용하기
유니티 애니메이터 FSM으로 활용하기Jungsoo Park
 
48시간, 복셀로 표현하기
48시간, 복셀로 표현하기48시간, 복셀로 표현하기
48시간, 복셀로 표현하기Jungsoo Park
 
풀타임 개발 도전기
풀타임 개발 도전기풀타임 개발 도전기
풀타임 개발 도전기Jungsoo Park
 
LINQ란 무엇인가
LINQ란 무엇인가LINQ란 무엇인가
LINQ란 무엇인가Jungsoo Park
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?Jungsoo Park
 
유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기Jungsoo Park
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기Jungsoo Park
 
딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기Jungsoo Park
 

More from Jungsoo Park (9)

유니티 애니메이터 FSM으로 활용하기
유니티 애니메이터 FSM으로 활용하기유니티 애니메이터 FSM으로 활용하기
유니티 애니메이터 FSM으로 활용하기
 
NABLA 개발기
NABLA 개발기NABLA 개발기
NABLA 개발기
 
48시간, 복셀로 표현하기
48시간, 복셀로 표현하기48시간, 복셀로 표현하기
48시간, 복셀로 표현하기
 
풀타임 개발 도전기
풀타임 개발 도전기풀타임 개발 도전기
풀타임 개발 도전기
 
LINQ란 무엇인가
LINQ란 무엇인가LINQ란 무엇인가
LINQ란 무엇인가
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?
 
유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기
 
딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기
 

셰이더가 뭐에요?

  • 1. 텍스트 셰이더가 뭐에요? 외계어 ㄷㄷ 수학 ㄷㄷ 근데 해보고 싶어!
  • 2. 셰이더가 뭔데 그래요 컴퓨터 그래픽스 분야에서 셰이 더(shader)는 소프트웨어 명령 의 집합으로 주로 그래픽 하드웨 어의 렌더링 효과를 계산하는 데 쓰인다. 셰이더는 그래픽 처리 장치 (GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 프로그래 밍하는 데 쓰인다. 요약하면 데이터 쪼가리를 모니 터 밖으로 꺼내주는 코드
  • 3. 데이터에서 모니터까지 공간상의 좌표 화면 좌표 좌표계 변 환 픽셀 배열 Rasterize
  • 4. 데이터에서 모니터까지 공간상의 좌표 화면 좌표 좌표계 변 환 픽셀 배열 Rasterize 각각의 정점에 대한 계산 : 이 정점은 화면 어디에 위치해야 할까? 빛을 어느 방향에서 얼만큼 받을까? 각각의 픽셀에 대한 계산 : 이 픽셀은 무슨 색일까?
  • 5. 데이터에서 모니터까지 공간상의 좌표 화면 좌표 좌표계 변 환 픽셀 배열 Rasterize 각각의 정점에 대한 계산 : 이 정점은 화면 어디에 위치해야 할까? 빛을 어느 방향에서 얼만큼 받을까? 각각의 픽셀에 대한 계산 : 이 픽셀은 무슨 색일까? 정점 셰이더 픽셀 셰이더
  • 6. 정점 셰이더에서 픽셀 셰이 더로 정점별 계산 결과물을 위치관계에 따라 선형보 간해서 픽셀 셰이더로 전달 색상 데이터를 전달한다 면 : 정점 1은 흰색, 정점 3은 검은색 -> 가운데 픽셀 셰이더 에게는 회색이 전달된다 ! 3 여기는 회색!
  • 7. 실제 코드를 봅시다 유니티의 ShaderLab 코드 안 에 nVidia의 Cg 코드가 삽입된 형태 그래서 외계어처럼 보였었구나 .... 이만큼 Cg 코드 요 바깥은 ShaderLab 코드
  • 8. 실제 코드를 봅시다 정점 셰이더 : 정점의 좌표를 화면좌표계로 옮겨라 픽셀 셰이더 : 빨갛게 칠해라
  • 11. 정반사 / Specular reflection 입사한 빛이 한 방향으 로 반사된다고 가정 보는 방향에 따라 밝게 보이는 위치가 다르다! 시선의 방향과 반사광의 방향을 내적하여 구할 수 있다
  • 12. 난반사 / Diffuse reflection 입사한 빛이 모든 방향 으로 균일하게 반사된다고 가 정 밝은 부분은 어느 방향 에서 봐도 밝다! 표면의 방향과 빛의 방 향을 내적하여 구할 수 있다
  • 13. 정점마다 빛의 반사 계산하 기 카메라의 방향벡터 (World 좌표계) 광선의 방향벡터 (World 좌표계) 정점의 수직벡터 (World 좌표계) 정반사 (0~1) 난반사 (0~1) (Per-Vertex Diffuse+Specular shading) 밝기 텍스쳐 픽셀 색상 정점 셰이더 픽셀 셰이더
  • 14. 픽셀의 수직벡 터 픽셀마다 빛의 반사 계산하 기 카메라의 방향벡터 (World 좌표계) 광선의 방향벡터 (World 좌표계) 정점의 수직벡터 (World 좌표계) 정반사 (0~1) 난반사 (0~1) (Per-Pixel Diffuse+Specular shading) 밝기 텍스쳐 픽셀 색상 정점 셰이더 픽셀 셰이더 노멀 맵 범프 맵 스페큘러 맵 X
  • 15. 정점 계산법과 픽셀 계산법 어느 단계에서 계산할 것 인가? 정점에 대해서만 계산하면 계산량이 대폭 줄어들지만 정확도 역시 부족하다 픽셀별 계산을 하면 픽셀 별로 보간된 수직방향을 사용하며, 노멀맵이나 스 페큘러 맵 등을 사용할 수 있다
  • 16. 예시 : 간단한 정점 난반사 셰이딩 Per-Vertex Diffuse Shading #include "UnityCG.cginc" uniform float4 _LightColor0; // color of light source (from "Lighting.cginc") uniform float4 _Color; // define shader property for shaders struct vertexInput { float4 vertex : POSITION; float3 normal : NORMAL; }; struct vertexOutput { float4 pos : SV_POSITION; float4 col : COLOR; }; vertexOutput vert(vertexInput input) { vertexOutput output; float4x4 modelMatrix = _Object2World; float4x4 modelMatrixInverse = _World2Object; // multiplication with unity_Scale.w is unnecessary // because we normalize transformed vectors float3 normalDirection = normalize( mul(float4(input.normal, 0.0), modelMatrixInverse).xyz); float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz); float3 diffuseReflection = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection)); output.col = float4(diffuseReflection, 1.0); output.pos = mul(UNITY_MATRIX_MVP, input.vertex); return output; } float4 frag(vertexOutput input) : COLOR { return input.col; } 정점 셰이더에서 입력받을 데이터 선언 정점 셰이더에서 픽셀 셰이 더로 보낼 데이터 선언 정점 라이팅 셰이더이므로 픽셀 셰이더는 그냥 입력받은 색상 값을 그대로 리턴
  • 17. 예시 : 간단한 정점 난반사 셰이딩 Per-Vertex Diffuse Shading vertexOutput vert(vertexInput input) { vertexOutput output; float4x4 modelMatrix = _Object2World; float4x4 modelMatrixInverse = _World2Object; // multiplication with unity_Scale.w is unnecessary // because we normalize transformed vectors float3 normalDirection = normalize( mul(float4(input.normal, 0.0), modelMatrixInverse).xyz); float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz); float3 diffuseReflection = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection)); output.col = float4(diffuseReflection, 1.0); output.pos = mul(UNITY_MATRIX_MVP, input.vertex); return output; } 정점의 수직 방향과 빛의 방향을 월드 좌표계에서 정규화하여 나타냄 정점의 수직 방향과 빛의 방향 을 내적하여 난반사량을 구함 반사량과 정점 위치를 리턴
  • 18. 정리 정점 셰이더는 정점별 계산을 하고, 픽셀 셰이더는 픽셀별 계산을 한다 정반사는 보는 각도에 따라 밝은 부위가 변하고, 난반사는 보는 각도에 상관없이 밝은 부위가 일정하다 정점 셰이더 라이팅은 가볍고, 픽셀 셰이더 라이팅은 정확하다