쉐이더 생성후 테스트
참고자료
https://www.slideshare.net/iFunFactory/ss-74059131
http://chulin28ho.tistory.com/290
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | Shader "Custom/TestShader" { // Properties영역 인스팩터에 노출된다. Properties { _Color("Color", Color) = (1, 1, 1, 1) _MainTexture("Albedo (RGB)", 2D) = "white" {} _Glossiness("Smoothness", Range(0,1)) = 0.5 _Metallic("Metallic", Range(0,1)) = 0.0 _Vector("TestVector", Vector) = (0, 0, 0, 0) _Float("TestFloat", Float) = 0.5 } // 쉐이더 영역 여러개의 SubShader {}를 만들수 있다. SubShader { Tags { "RenderType" = "Opaque" } // CGPROGRAM ~ ENDCG CG언어를 이용해서 쉐이더 작성 // CGPROGRAM ~ ENDCG CGPROGRAM ~ ENDCG CGPROGRAM ~ ENDCG = 3 Pass CGPROGRAM // 전처리, 스니핏(snippet) 이라고 불림. // 조명계산 설정이나 기타 세부적인 분기를 정해할 수 있음. #pragma surface surf Standard fullforwardshadows #pragma target 3.0 // 인스팩터에 노출된 프로퍼티의 값을 저장할 변수정의(이름 동일해야함.) // sampler는 텍스쳐정보를 받아준다. uv이름(uv_MainTexture) sampler2D _MainTexture; struct Input { float2 uv_MainTexture; }; fixed4 _Color; half _Glossiness; half _Metallic; float4 _Vector; float _Float; /* 내부 인클루드 파일에 정의됨. struct SurfaceOutputStandard { fiexd3 Albedo; fiexd3 Normal; fiexd3 Emission; half Metallic; half Smoothness; half Occlusion; half Alpha; }; // 여기부턴 버텍스 쉐이더 사용할 struct appdate_base { float4 vartex: POSTION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID } struct appdate_tan { float4 vartex: POSTION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID } struct appdate_full { float4 vartex: POSTION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; fixed4 color : COLOR; UNITY_VERTEX_INPUT_INSTANCE_ID } // 버텍스의 위치 float4 vartex: POSTION // 접선 방향(NormalMap 연산할 때 주로 사용되는 축) float4 tangent : TANGENT; // 버텍스의 노멀 float3 normal : NORMAL; // 첫 번째 UV좌표 float4 texcoord : TEXCOORD0; // 두 번째 UV좌표 라이트맵용 커스텀 UV 데이터를 사용할 때 많이사용 float4 texcoord1 : TEXCOORD1; // 세 번째 UV좌표 특별한 경우 사용함. float4 texcoord2 : TEXCOORD2; // 네 번째 UV좌표 특별한 경우 사용함. float4 texcoord3 : TEXCOORD3; // 버텍스 컬러를 의미합니다. fixed4 color : COLOR; */ #pragma surface surf vertex:vert noshadow void vert(inout appdata_full v) { // 버텍스 쉐이더를 작성 } void surf(Input IN, inout SurfaceOutputStandard o) { // tex2D는 UV좌표에 _MainTexture 컬러값을 찾아줌 fixed4 c = tex2D(_MainTexture, IN.uv_MainTexture) * _Color; // 순서에 상관없이 꺼내 사용 가능함. o.Albedo = c.rgb; // o.Albedo = c.rrr; // o.Albedo = c.ggg; // o.Albedo = c.bbb; // o.Albedo = c.rrb; // o.Albedo = c.bbg; // o.Albedo = c.gbb; // o.Albedo = c.rgg; // o.Albedo = c.bgr; o.Smoothness = _Glossiness; o.Metallic = _Metallic; o.Alpha = c.a; } // #pragma surface surf Test noambient float4 LightingTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) { // Lambert float3 diffuseColor; float ndot1 = saturate(dot(s.Normal, lightDir)); diffuseColor.rgb = ndot1 * s.Albedo * _LightColor0.rgb * atten; // Specular float3 specularColor; float3 harp = normalize(lightDir + viewDir); float specular = saturate(dot(harp, s.Normal)); specular = pow(specular, _SpecularPower); specularColor = specular * _SpecularColor.rgb * s.Gloss; // RimLight float3 rimColor; float rim = abs(dot(viewDir, s.Normal)); float inverim = 1 - rim; rimColor = pow(inverim, _RimPower) * _RimColor.rgb; // Fare Specular float3 specularColor2; specularColor2 = pow(rim, 50) * float3(0.2, 0.2, 0.2) * s.Gloss; float4 final; final.rgb = diffuseColor + specularColor + rimColor; final.a = s.Alpha; return final; } // #pragma surface surf NoLighting fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten) { return fixed4(0, 0, 0, 1); } // #pragma surface surf Toon fixed4 LightingToon(SurfaceOutput s, fixed3 lightDir, fixed atten) { return fixed4(0, 0, 0, 1); } // #pragma surface surf SimpleSpecular half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) { return half4(0, 0, 0, 0); } ENDCG } FallBack "Diffuse" } | cs |
쉐이더를 처음 접하면 float / half / fixed 중에 float만 본적이 있을듯 함.
정밀도에 따라 골라서 사용하면 됨.
Nvidia쪽 GPU의 경우 hlaf로 연산할 때 연산수가 2배로 빨라진다.
Pass 블록은 GameObject의 기하학을 한 번 렌더링합니다.
UsePass 명령은 다른 쉐이더에서 명명 된 패스를 사용합니다.
GrabPass는 특수 패스 유형입니다.
오브젝트가 화면에 그려지는 화면의 내용을 텍스처로 가져옵니다.
이 텍스쳐는 후속 패스에서 고급 이미지 기반 효과를 수행하는 데 사용할 수 있습니다.
서브 쉐이더는 태그를 사용하여 렌더링 엔진에 렌더링 할 방법과시기를 알려줍니다.
Writing vertex and fragment shaders
반응형
'Programming > Shader' 카테고리의 다른 글
[Unity Shader] 외곽선 Outline, ToonShader (2) | 2015.10.10 |
---|---|
[Unity Shader] Reflection Probe 반사처리 (0) | 2015.10.06 |
[Unity Shader] 실수 및 에러 정리 (0) | 2015.10.01 |
[Unity Shader] Blinn-Phong-Gloss (0) | 2015.09.30 |
[Unity Shader] Parts Color Shader (0) | 2015.09.24 |
[Unity Shader] Rim Light, Hologram (0) | 2015.09.23 |
[Unity Shader] BumpMap, BlinnPhong (0) | 2015.09.21 |
[Unity Shader] 머테리얼색 반전, 회색, 시간에 따라 색깔 바꾸기 (0) | 2015.09.17 |