Shader "ryoo/RyooSpecularzero"
{
Properties
{
_DiffuseTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,0,0,1)
_Ambient ("Ambient", Range (0, 1)) = 0.25
_SpecColor ("Specular Material Color", Color) = (1,1,1,1) // 스페큘러 컬러
_Shininess ( "Shininess", Float) = 10 // 스페큘러 강도
}
SubShader
{
Tags { "LightMode" = "ForwardBase" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct v2f // v2f struct(구조체)에 변수를 추가하고, v2f를 통해 프레그먼트 셰이더에 전달
{
float2 uv : TEXCOORD0;
float4 vertexClip : SV_POSITION;
float4 vertexWorld : TEXCOORD2; // 프레그먼트 셰이더에서 광원 방향 벡터 계산
float3 worldNormal : TEXCOORD1;
};
sampler2D _DiffuseTex;
float4 _DiffuseTex_ST;
float4 _Color;
float _Ambient;
float _Shininess;
v2f vert (appdata v) //정점 셰이더 부분
{
v2f o;
o.vertexClip = UnityObjectToClipPos(v.vertex);
o.vertexWorld = mul(unity_ObjectToWorld, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _DiffuseTex); //텍스쳐 영역
float3 worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldNormal = worldNormal;
return o;
}
float4 frag (v2f i) : SV_Target //프레그먼트 셰이더 부분
{
//정규화된 월드 공간의 노멀 벡터
float3 normalDirection = normalize( i.worldNormal);
// 정규화된 뷰 방향 벡터
float3 viewDirection = normalize(UnityWorldSpaceViewDir(i. vertexWorld));
// 정규화된 광원 방향 벡터
float3 lightDirection = normalize(UnityWorldSpaceLightDir(i. vertexWorld));
//텍스쳐 영역
float4 tex =tex2D(_DiffuseTex, i.uv);
// 디퓨즈(람버트) 구현
float nl = max(_Ambient, dot(normalDirection, lightDirection));
float4 diffuseTerm = nl * _Color * tex * _LightColor0;
//스페큘러(퐁) 구현
float3 reflectionDirection = reflect(-lightDirection, normalDirection);
float3 specularDot = max(0.0, dot(viewDirection, reflectionDirection));
float3 specular = pow(specularDot, _Shininess);
float4 specularTerm = float4( specular, 1) * _SpecColor * _LightColor0;
float4 finalColor = diffuseTerm + specularTerm;
return finalColor;
}
ENDCG
}
}
}
참고서적: 유니티 물리 기반 셰이더 개발
'Unity > Code base Shader' 카테고리의 다른 글
Unity Shader에 대한 이해 (0) | 2021.01.01 |
---|---|
Specular 다 광원지원 (0) | 2020.12.21 |
diffuseShader (0) | 2020.12.15 |
좌표공간 변환 (0) | 2020.12.12 |
내적(dot) (0) | 2020.12.12 |