쉐이더
-화면에 출력하는 픽셀을 정해주는 함수
=> 다양한 재질을 표현할 수 있는 방법
랜더링 파이프라인
-3d장면을 구성하기 위해 2d 화면에 구현하는 일련의 과정
오브젝트 데이터
-메쉬가 있다 : 메쉬 안에 정점들이 있다.(Vertex로 이루어진 물체의 데이터 값)
Vertext 셰이더
월드좌표로 옮겨진 Vertex 값들은 카메라를 중심의 상대적 위치로 다시 한번 연산된다.
-카메라 좌표 안으로 들어와야 랜더링이 가능하다(: Rasterization O, 픽셀화O)
-Rasterization : 픽셀화- 모니터에서 표현될 때 어느 픽셀로 표현 될것인가.
픽셀 쉐이더
- 텍스처 음영 담당. 조명, 텍스처, 그림자, 특수 효과 등을 연산
모니터에서 표현되는 색은 가산혼합으로 만들어진다. 한개의 픽셀은 3개의 서브 픽셀로 이루어진다.
이 한 픽셀의 색을 결정하는 코드를 픽셀 쉐이더라고 부른다.
유니티 쉐이더는 쉐이더 랩이라는 스크립트 언어를 사용한다.
Surface Shader
-ShaderLab 스크립트와 CG 쉐이더 코드를 같이 사용하는 방법이다.
create>shader> standarad surface shader
-크게 Properties와 SubShader로 나눌 수 있다.
-프로퍼티에 정의된 것은 인스펙터에 표현된다.
-CGPROGRAM~ENDCG 까지가 surface shader 영역이다.
https://docs.unity3d.com/kr/530/Manual/SL-Properties.html
인터페이스 만들기
sampler - 텍스처를 받아 색상(Float4)으로 나타낼 수 없다.
https://docs.unity3d.com/kr/2021.3/Manual/SL-SurfaceShaders.html
Shader "Custom/Red"
{
Properties
{
_MyColor("MyColor", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf _MyLightModel noambient noshadow
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
};
fixed4 _MyColor;
void surf (Input IN, inout SurfaceOutput o)
{
//o.Albedo = fixed3(_MyColor.r,_MyColor.g,_MyColor.b);
// o.Albedo = _MyColor;//Albedo는 빛의 영향을 받는다
//o.Emmision = _MyColor;//Emission은 빛의 영향 X but 물리엔진에 의한 빛O
o.Emission = fixed3(_MyColor.r,_MyColor.g,_MyColor.b);
}
half4 Lighting_MyLightModel(SurfaceOutput s,half3 lightDir ,half atten){
half ndotl = saturate(dot(s.Normal, lightDir));
half4 final;
final.rgb = s.Emission * ndotl;
// final.rgb = s.Albedo * ndotl;
final.a = s.Alpha;
return final;
}
ENDCG
}
FallBack "Diffuse"
}