그레이 컬러를 더했을때와 vector3를 더했을때 달라지는 이유는

 

color Sapce를 gamma로 바꾸면 똑같아진다.

요렇게 하면 똑같아진다.

 

split- 쪼개고, combine- 묶고

Flip- RGBA를 뒤집는다.(마이너스로 변환)

Swizzle- RGBA채널을 바꿀수 있다.

고라니TV  외에 여러 사이트에서 참고하였습니다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph-input02  (0) 2020.06.29
Shader graph -input01  (0) 2020.06.11
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic02  (0) 2020.05.29

Normal From Texture - 일반텍스쳐에서 노멀추출

Normal Blend - 노멀끼리 블랜딩 시킴

voronoi-세포처럼 이미지를 만든다.

Normal From Height - 노멀이 높이값을 만든다.

Normal Strength - 노멀의 강도를 만든다.

 

Normal Reconstruct- 노멀컬러 보정?,그다지 의미있는 기능은 아님..

Normal unpack-노멀안된것을 노멀로 만드는?, 그다지 의미있는 기능은 아님..

 

 

Colorspace Conversion - Linear, HSV로 바꾼다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph -input01  (0) 2020.06.11
Shader graph -channel01  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic02  (0) 2020.05.29
Shader graph -Artistic01  (0) 2020.05.28

youtu.be/UsyvT36vqpU

많은 것이 좋아졌다고하는데 뚜렷이 무엇이 좋아졌는지 잘 알수가 없었는데, 이내용을 보면 개선된 방식이라는게 느껴지긴합니다.

 

제가 받아들인 요약은

1. 같은 프로젝트라도 드로우콜 800짜리가 500짜리대로 떨어짐.

2. 조명이 여러개 써도 괜찮을정도로 개선됨(여러 조명을 하나의 조명?으로 계산을 한다고 했나?) 하튼 실시간 라이트를 32개정도까지 써도 될정도로 효율이 좋아짐.

3. 이전 파이프라인 쉐이더는 여러개의 오브젝트가 있을때 오브젝트마다 드로우콜이 증가했지만, URP 기본 쉐이더를 여러 오브젝트가 같이 사용시 드로우콜을 1개로 바꿔버린다.(이건 획기적이긴한데... 커스텀은.....?)

4. 왜 이렇게 효율이 좋아지는가 하면 이전에는 배치가 메터리얼 단위로 일어나기 때문이었지만, SRP로 바뀌면서 쉐이더 단위로 바뀌어서 메터리얼이 많아져도 같은 쉐이더라면 효율이 좋아진다는것입니다.

(reder list에서 SRP Batcher를 키는것이 중요하다.)

 

https://forum.unity.com/threads/how-to-create-matcap-shaders-with-shader-graph.770285/

 

역시 찾아보니 방법이 있군요.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Artistic02  (0) 2020.05.29
Shader graph -Artistic01  (0) 2020.05.28
URP Shader graph  (0) 2020.05.27

Blend, Dither

ChannelMask(원하는 채널을 선별하여 가릴수있다.)

 

ColorMask

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic01  (0) 2020.05.28
URP Shader graph  (0) 2020.05.27

Adjustment

 

일종에...포토샵에서 컬러가지고 변화를 여러가지 주는 장치

 

 

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic02  (0) 2020.05.29
URP Shader graph  (0) 2020.05.27
2D Renderer Sprite Lit Graph 스프라이트에서 빛에 반응하는 그래프  
  Sprite UnLit Graph

스파라이트에서 빛에 반응하지 않는 그래프

 
Unlit Graph  

3D에서 빛에 반응하지 않는 그래프

 
PBR Graph   물리기반 그래프  
VFX Shader Graph  

파트클에서 사용되는 그래프

 
Sub Graph  

그래프를 묶을수 있는 그래프

 

 

float 32비트
half 16비트 이미지 손실이 일어날수있다.

Metal Reflectance는 금속재질에 따른 컬러가 셋팅되어있어서 스페큘러에 적용하면된다.

 

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic02  (0) 2020.05.29
Shader graph -Artistic01  (0) 2020.05.28

       
 

유니티는 프레임 디버거를 이용하여 프레임마다 그려지는 게임오브젝트의 순서를 눈으로 확인할수 있다.

   
 

어떤것부터 그리는지 알수없다.

   
 

그려지는 순서에 따라 오브젝트가 가려질수 있다.

   
       
 

불투명 오브젝트를 먼저 그린다.

   
 

반투명 오베즉트는 나중에 그린다.

   
 

반투명 오브젝트끼리는 뒤에서부터 그린다.

   
 

알파 소팅을 써봤자 완벽하게 앞뒤를 제대로 판정할수 없으니, 알파를 썼을때 문제는 일어난다.

   
 

알파 블렌딩을 사용하였을때에는 Zwrite 하지 않는다.

   
 

이문제를 해결하기 위하여 고민이 필요하다.

   
       
       

z Buffer

앞뒤 판정을 위해서 픽셀마다 기준으로 가장 가까운 오브젝트의 깊이값이 저장되어있는 데이터

   
       
       
       

OverDraw

그려진 이미지위에 덧그려지는

   
       
       

Alpha sorting

멀리 있는것부터 차례대로 그리는

   
       

Deferred Rendering

반투명을 처리할수 없다.(할수있지만 어렵다?)

   
       

Foward Rendering

     
       

Opaque

불투명

   
       

Transparent

반투명

   
       
       

알파 구현1

Shader "Custom/108_alpha"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}

이미지는 옵션을 clamp 두는것이 좋다.
그래야 반복되는 부분의 끝부분이 보인다던가 하는
문제를 해결할수 있다.

 
 

SubShader
{
Tags { "RenderType"="Transparent" "Queue"= "Transparent"}
cull off

CGPROGRAM
#pragma surface surf Lambert alpha:fade

cull off 양면구현

 
 

sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
};

   
 

void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG

   
 

}
FallBack "Legacy Shaders/Transparent/VertexLit" //"Diffuse"
}

Diffuse 놓으면 폴리곤 형태 그대로의 그림자가 나오게 된다.
이부분은 그림자를 끄는것이고 이를 사실 완전한 구현이라 할수없다.
그래서 AlphaTest(Cutout) 쉐이더를 사용한다.

Legacy Shaders/Transparent/Diffuse
이렇게해도 결과는 같다.

 
       

알파 구현2
(
알파된 오브젝트 그림자 구현)

Shader "Custom/109_alpha_cutout"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1))=0.5
}

 

하나는 알파테스트이고,
하나는 그냥 트랜스파렌트이다.
둘다 적용이 가능하다.

 

SubShader
{

Tags { "RenderType"="TransparentCutout" "Queue"= "AlphaTest"}
cull off

CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff

SubShader
{
Tags { "RenderType"="Transparent" "Queue"= "Transparent"}

cull off

CGPROGRAM
#pragma surface surf Lambert alpha:fade

 
 

sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
};

   
 

void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Legacy Shaders/Transparent/Cutout/VertexLit"

void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Legacy Shaders/Transparent/Cutout/VertexLit"

 

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

가짜 리플렉션  (0) 2020.11.10
기본적인 일반텍스쳐+노멀+아웃라인 적용 쉐이더  (0) 2020.10.06
RampTexture  (0) 2020.05.21
OUTLINE  (0) 2020.05.17
프레넬 공식  (0) 2020.05.17

RampTexture

Shader "Custom/104_RampTexture"
{
Properties
{

_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RampTex ("RampTex", 2D) = "white" {}

}

 
 

SubShader
{
Tags { "RenderType"="Opaque" }


CGPROGRAM
#pragma surface surf warp noambient

sampler2D _MainTex;
sampler2D _RampTex;

warp관련되서 계속 오류가 있었는데, 이유를 찾지못하다가
알고보니, 밑에 Lightingwarp Lightingtoon으로 해놨었음.
라이트이름만인줄알았지만 라이트설정을 받을때도 쓴다.

 

struct Input
{
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}

 
 

float4 Lightingwarp( SurfaceOutput s,float3 lightDir, float atten)
{
float ndotl = dot(s.Normal,lightDir); //*0.5+0.5;
//float4 ramp = tex2D(_RampTex, float2(0.1,0.1));
float4 ramp = tex2D(_RampTex, float2
(ndotl,0.5));
return ramp;

}

 
 

ENDCG

}
FallBack "Diffuse"

 

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

기본적인 일반텍스쳐+노멀+아웃라인 적용 쉐이더  (0) 2020.10.06
Alpha  (0) 2020.05.24
OUTLINE  (0) 2020.05.17
프레넬 공식  (0) 2020.05.17
Lambert 공식  (0) 2020.05.17

매번 찾기가 귀찮아서 정리함.

 

모델링툴 자체에서 최적화 하는게 사실 가장 좋고, 밑에 수단은 사실 무게가 많이 나가는 폴리곤이나 해당되는

내용이라 생각됩니다. 이미 최적화가 잘되어있다면, 체크할 옵션은 그다지 없다고 봅니다.

모델링에서 최적화는 폴리곤만 생각할수있는데, 노멀도 관계가 있습니다.

 

유니티에서는 모델링할때 스무스 그룹 갯수를 늘리면 그만큼 vertex에 대한 정보가 늘어납니다.

그래서 폴리곤수가 늘어나는 효과가 있을수 있습니다. 그래서 스무스그룹을 최소화 하는것이 좋다고 생각합니다.

모델링하다보면 스무스그룹이 원치않게 많이 늘어납니다. 마무리에 한번 최적화하는것이 좋다는것이지요.

 

이를 최적화하는것이 밑에 Normals인데, 이미 모델링에서 스무스그룹을 적게 만들었다면 의미없는 체크가 됩니다.

(개인적으로 모델링 자체적으로 최적화를 잘하고 아무것도 체크안하는게 좋다고 생각합니다.

하지만, 관리가 안된다면 사용하는건데, 코드가 더 들어간다는것 자체가 좋은건 아닐겁니다.)

 

'Unity > ETC' 카테고리의 다른 글

RealToon Tutorials  (0) 2020.07.29
유니티짱 쉐이더 설정  (0) 2020.07.29
캐릭터 폴리곤  (0) 2020.07.29
최적화에 대한  (0) 2020.05.17
잡다한..  (0) 2020.05.16

 

 

 

outline

Shader "Custom/101_outline-2pass"
{
Properties
{

_MainTex ("Albedo (RGB)", 2D) = "white" {}

}

 
 

SubShader
{
Tags { "RenderType"="Opaque" }

cull front

//1st pass
CGPROGRAM
#pragma surface surf Nolight vertex:vert noshadow noambient
<![if !supportLineBreakNewLine]>
<![endif]>

//vertex:vert 버텍스 함수 시작임을 나타낸다.
//noshadow: 만약 그림자 패스에도 확장된 버텍스 영향을 주고 싶다면,
addshadow
라고 써준다.
//noambient :
앰비언트 없애고
//nolight :
빛도 없애고

 

sampler2D _MainTex;

void vert(inout appdata_full v)


{
//float4 vertex : POSITION; //
모든 베텍스 쉐이더에 있음.
//float4 tangent : TANGENT; // appdata_full
tan 있다.
//float3 normal : NORMAL; //
모든 베텍스 쉐이더에 있음..
//float4 texcoord : TEXCOORD0; //
모든 베텍스 쉐이더에 있음.
//float4 texcoord1 : TEXCOORD1;//appdata_full
에만 있다.
//float4 texcoord2 : TEXCOORD2; //appdata_full
에만 있다.
//float4 texcoord3 : TEXCOORD3; //appdata_full
에만 있다.
//float4 color : COLOR; //appdata_full
에만 있다.
//UNITY_VERTEX_INPUT_INSTANCE_ID //
모든 베텍스 쉐이더에 있음.

//v.vertex.y = v.vertex.y + 0.1; //
이렇게 하면 모든 버텍스가 y축으로 0.1만큼 이동됨.(실제 오브젝트가 이동은 아님)
//v.vertex.y+= 0.1;
라고 써도 위랑 같음(+= 띄워 쓰면 안됨.)

//v.vertex.xyz = v.vertex.xyz +v. normal.xyz; //
버텍스가 확장된다.
//v.vertex.xyz+= v.vertex.xyz;
위랑 같은거임

v.vertex.xyz+= v.normal.xyz*0.005; //
버텍스가 확장된다.


}

//appdata_base:position, normal and one texture coordinates
:
위치, 노멀, 텍스쳐 좌표계

//appdata_tan: position, tangent, normal and one texture coordinates
:
위치, 탄젠트, 노멀, 1개의 텍스쳐 좌표계

//appdata_full: position, tangent, normal, four texture coordinates and color
:
위치, 탄젠트, 노멀, 4개의 텍스쳐 좌표계와 버텍스 컬러

//3
가지중 당연히 base 가장 가벼움.

 

struct Input
{
float4 color:COLOR; //
필요없는데 아무것도 없으면 문제가 생기기 때문에 아무거나 넣은거.
};

void surf (Input IN, inout SurfaceOutput o)
{
//
아무것도 없어도 문제가 안생김.
// Albedo
없는 이유: 라이팅 계산조차 필요하지 않기 때문에 컬러를 넣을 필요가 없음. 검은색이니깐
}

float4 LightingNolight( SurfaceOutput s,float3 lightDir, float atten)
{
return float4(0,0,0,1);
}

ENDCG

 
 

cull back

//2nd pass
CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG

}
FallBack "Diffuse"
}

 
     
     

끊어지는 음영
카툰

Shader "Custom/102_IF_CUT_shadow"
{
Properties
{

_MainTex ("Albedo (RGB)", 2D) = "white" {}

}
SubShader
{
Tags { "RenderType"="Opaque" }

 
 

cull back

//2nd pass
CGPROGRAM
#pragma surface surf Toon noambient

sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}

 
 

float4 LightingToon( SurfaceOutput s,float3 lightDir, float atten)
{
float ndotl = dot(s.Normal,lightDir);//*0.5+0.5; //half Lambert
만든거임.

if (ndotl>0.7)
{
ndotl=1;
}
else if (ndotl>0.4)
{
ndotl=0.3;
}
else
{
ndotl=0;
}

 
 


//return ndotl;
텍스쳐 없이 컬러 음영만 테스트시
float4 final;
final.rgb=s.Albedo * ndotl *_LightColor0.rgb;
final.a=s.Alpha;

return final;
}

ENDCG

}
FallBack "Diffuse"

 
     

Fresnel outline

Shader "Custom/102_IF_CUT_shadow"
{
Properties
{

_MainTex ("Albedo (RGB)", 2D) = "white" {}

}
SubShader
{
Tags { "RenderType"="Opaque" }

 
 

cull back

//2nd pass
CGPROGRAM
#pragma surface surf Toon noambient

sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}

 
 

float4 LightingToon( SurfaceOutput s,float3 lightDir, float3 viewDir, float atten)
{
float ndotl = dot(s.Normal,lightDir);//*0.5+0.5; //half Lambert
만든거임.

if (ndotl>0.7)
{
ndotl=1;
}
else if (ndotl>0.4)
{
ndotl=0.3;
}
else
{
ndotl=0;
}

 
 

float rim = abs(dot(s.Normal,viewDir));
if(rim>0.3)
{
rim =1;
}
else
{
rim =-1;
}

else 부분이 0 아닌 이유는 최종적으로 ambient color 더해지면서
검은색 선이 ambient color 밝아지기 때문이다. 그영향을 없애려고
마이너스-1 들어간것입니다.

 


//return ndotl;
텍스쳐 없이 컬러 음영만 테스트시
float4 final;
final.rgb=s.Albedo * ndotl *_LightColor0.rgb;
final.a=s.Alpha;

return final;
}

ENDCG

}
FallBack "Diffuse"

 

유니티 쉐이더 스타트업 자료(정종필저)

 

'Unity > Surface Shader' 카테고리의 다른 글

Alpha  (0) 2020.05.24
RampTexture  (0) 2020.05.21
프레넬 공식  (0) 2020.05.17
Lambert 공식  (0) 2020.05.17
라이팅구조  (0) 2020.05.17

youtu.be/A74n1nh1WRk

 

만들었는데..완성은 안했습니다...

레벨 20까지인가..만들었는데..

발상은 좋았으나...재미도 부족하고...컨텐츠도 부족하고...

'Unity > Playmaker' 카테고리의 다른 글

RPG...망...  (0) 2020.05.17
아브라카다브라 로또 와 운세(개인개발)  (0) 2020.05.16
애니몰(개인개발)  (0) 2020.05.16
스톱히어로(개인 개발)  (0) 2020.05.16
게임아츠 플레이메이커 4강  (0) 2020.05.16

youtu.be/XA-gLxQpxxo

역작을 만들어보고 싶었습니다.... 그랬다구요...

'Unity > Playmaker' 카테고리의 다른 글

미출시  (0) 2020.05.17
아브라카다브라 로또 와 운세(개인개발)  (0) 2020.05.16
애니몰(개인개발)  (0) 2020.05.16
스톱히어로(개인 개발)  (0) 2020.05.16
게임아츠 플레이메이커 4강  (0) 2020.05.16

- AlphaTest보다는 알파 AlphaBlend가 더 낫습니다. 적어도 모바일에서는...

  PC에서는 AlpahTest가 AlphaBlend보다 연산이 빠르다고하지만 모바일에서는 일부기기적인 특성때문이라고 함.

- Unity Texture 옵션 중 Read/Write Enable 옵션은 비활성화 하는것이 좋다.

  항상 메모리에 상주하게 되는 옵션이므로 낭비하지 않는것이 좋다.

- Texture는 2의 승수를 쓰는것이 좋다. 간혹 배율이 안맞거나 하는 형식으로 넣는데도 문제가 없는 이유는,

  모두 빌드될때 2의 승수로 변경이 되기 때문이다. 이는 메모리 낭비를 초래할수 있으므로,

   2의 승수로 유지하는것이 좋다.

   안드로이드는 관계 없으나 아이폰은 정방향 사이즈로 변환되므로 비율이 다를 경우 메모리가 늘수 있다.

- 캐릭터의 경우 쉐이더에 따라 렌더링이 배가 될수 있으므로 계산에 착오가 없도록 하자.

- 밉맵은 상황에 따라 쓰지만 안쓰는곳에서 구지 써서 메모리를 잡을 필요는 없다.

  (이건 RPG나 쓰라고...멀리보이는 상황도 없는 게임에 쓰는게 어떠 도움도 되지 않는다고 생각된다.)

- 배경의 경우 베이크하는것좋다. 실시간 라이트는 어찌되었던 부하가 크다.

- 배경이나 움지이지 않는 물체는 Static의 활용을 잘하는것도 중요하다.

- 캐릭터의 본의 경우 100개를 넘지 않는것이 좋다. (경험상이나 계속 스펙이 좋아지고 있어서...)

- 페이셜 관련하여 Morph나 본은 선택사항이다.(어느게 더 좋은건 없다. 상황에 맞는 선택이다...)

- 이펙트도 아틀라스 사용..

- UI 아틀라스 사용..

- 요즘은 갤3를 최저로 놓고 한다고한다..(범용을 어디에 두는지 차이이다. 그냥 많은 폰에 대응하면 유저층이 넓어진다는 것인데, 개인적으로 게임유저는.. 후진폰을 안쓴다... 타겟층을 어디에 둘지 보고 판단하는게 좋다.)

- 요즘같이 폰종류가 너무 많다면, 스펙에 따라 그래픽 퀄을 대응하는것이 좋지 않을까 싶다.

   (요즘은 모바일도 그래픽 옵션이 있다.)

- 사운드의 경우 Wav가 좋다. 구지 mp3로 넣을 필요는 없다. 어차피 내부적으로 자체 인코더로 용량을 변경시킨다.

- 요즘은(2019) 한화면에 300미만 드로우콜, 25미만 폴리곤을 사용한다고 한다.

   (RPG의 예시이며, 게임마다 로직과 타겟이 달라서 참고만 하는게 좋다.)

- SetPas Calls 을 늘 신경써라. 고성능에서는 모르지만 저성능에서는 체감이 확실히 온다.

 

 

 

 

'Unity > ETC' 카테고리의 다른 글

RealToon Tutorials  (0) 2020.07.29
유니티짱 쉐이더 설정  (0) 2020.07.29
캐릭터 폴리곤  (0) 2020.07.29
모델 데이터 최적화  (0) 2020.05.20
잡다한..  (0) 2020.05.16

 

 

 

프레넬 공식

     
     

Shader "Custom/20_Lambert_lim1"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimColor ("RimColor", Color) = (1,1,1,1)
_RimPower ("RimPower", Range(1,10)) = 3

}

 

SubShader
{
Tags { "RenderType"="Opaque" }

CGPROGRAM

#pragma surface surf Lambert noambient


sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
float3 viewDir; //
버텍스가 카메라 방향을 보는 방향
};

 

SubShader
{
Tags { "RenderType"="Opaque" }

CGPROGRAM

#pragma surface surf Lambert noambient


sampler2D _MainTex;
float4 _RimColor;
float _RimPower;

struct Input
{
float2 uv_MainTex;
float3 viewDir; //
버텍스가 카메라 방향을 보는 방향
};

 

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

float rim = dot(o.Normal, IN.viewDir);

o.Emission = pow(1- rim, 3);

o.Albedo = c.rgb;
//0
으로 놓고 하면 까만 초기 상태가 된다.
o.Alpha = c.a;
}

o.Emission = 1- rim 이렇게 하면 그래프로 보면 직각이된다.


그래서 pow(exponet, 지수) 써서 그래프가 산모양으로 되게 만들어서
굵기를 얇게 하는것이다.

pow
연산은 비교적 무겁다.

void surf (Input IN, inout SurfaceOutput o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

o.Albedo = 0;//0
으로 놓고 하면 까만 초기 상태가 된다.
float rim = dot(o.Normal, IN.viewDir);
o.Emission = pow(1- rim, _RimPower)*_RimColor.rgb;
o.Alpha = c.a;
}

 

ENDCG
}
FallBack "Diffuse"
}

 

ENDCG
}
FallBack "Diffuse"
}

유니티 쉐이더 스타트업 자료(정종필저)

 

'Unity > Surface Shader' 카테고리의 다른 글

RampTexture  (0) 2020.05.21
OUTLINE  (0) 2020.05.17
Lambert 공식  (0) 2020.05.17
라이팅구조  (0) 2020.05.17
Vertex color  (0) 2020.05.17

SurfaceOutput기본에

SubShader
{
Tags { "RenderType"="Opaque" }

CGPROGRAM


#pragma surface surf Test noambient

sampler2D _MainTex;
sampler2D _BumpMap;

struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
};


void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

o.Albedo = c.rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));
o.Alpha = c.a;
}

//#pragma surface surf Lambert noambient (Lambert test 바꿔서 해봄. 커스텀을 만들기 위함인듯)

noambient
엠비언트를 제거하여 lambert 확실하게 보기 위함이라고

라이트를 넣어서 구현

float4 LightingTest (SurfaceOutput s, float3 lightDir, float atten)
{

float ndotl = dot(s.Normal, lightDir)*0.5+0.5; // halp Lambert 연산 만들기
return ndotl;

}

ENDCG
}

float4 LightingTest (SurfaceOutput s, float3 lightDir, float atten)
Test
라는 라이팅을 float4 셋팅하겠다.(SurfaceOutput구조체를 쓰겠다 그리고 s라고 하겠다.
float3
으로 조명을셋팅하겠다. float atten으로 감쇠조명을 만들겠다.)

//Lighting+Test
붙여야함.

// return
값이 있어야 결과가 출력됨. ndotl=N(노멀)+L(라이트)+dot()
//float ndotl = dot(s.Normal, lightDir);
//float ndotl = saturate(dot(s.Normal, lightDir)); //saturate
함수는 0보다 낮은 값은 0으로 1보다 높은 값은 1
//float ndotl = max(0.2,dot(s.Normal, lightDir)); //max
한쪽의 값을 0.2으로 하면, 0.2보다 작은 다른쪽 값을 무조건 0으로 출력
//float ndotl = dot(s.Normal, lightDir)*0.5+0.5; // halp Lambert 연산 만들기

여기에 출력되는 return ndotl; return ndotl+0.5; 하면 밝아진다.

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

OUTLINE  (0) 2020.05.17
프레넬 공식  (0) 2020.05.17
라이팅구조  (0) 2020.05.17
Vertex color  (0) 2020.05.17
texture  (0) 2020.05.16

라이팅구조

램버트, 블린퐁, 스탠다드 3가지가 존재( 스페큘러 컬러를 조정하는것도 추가로 하나 있음.)

     
         

물리기반쉐이더

standard shader

struct SurfaceOutputstandard
{
fixed Albedo;
물체의 색상
fixed Normal;
노멀맵
fixed Emission;
빛영향받지 않는 색상
fixed Metalic;
재질금속
fixed Smoothness;
재질의 거침
fixed Occlusion;
오클루젼
fixed Alpha;
알파
};

PBS
(pysically based shader)

SurfaceOutputstandard
SurfaceOutputstandardStandardSpecular

기본쉐이더

Lambert / Blinn phong

struct SurfaceOutput
{
half3 Albedo;
물체의 색상
half3 Normal;
노멀맵
half3 Emission;
빛영향받지 않는 색상
half Specular;
하이라이트
half Gloss;
스페큘러 강도
half Alpha;
알파
};

   

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

프레넬 공식  (0) 2020.05.17
Lambert 공식  (0) 2020.05.17
Vertex color  (0) 2020.05.17
texture  (0) 2020.05.16
CGPROGRAM03  (0) 2020.05.16

버텍스컬러 출력하기

{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}


}

 

SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM

#pragma surface surf Standard noambient


sampler2D _MainTex;

struct Input
{
float2 uv_MainTex;
float4 color:COLOR; //
컬러를 추가하였음.
};

 

void surf (Input IN, inout SurfaceOutputStandard o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
//o.Albedo = c.rgb;
//o.Albedo = IN.color.rgb; //
이렇게 해도됨. 다만 그림자가 진다.
//o.Albedo = c.rgb+IN.color.rgb; //
이러면 버텍스 컬러와 이미지가 같이 나오겠지.
//o.Albedo = c.rgb*IN.color.rgb; //
이러면 버텍스 컬러와 이미지가 곱해지니깐 검은곳은 어둡게(검은곳은 0이니깐).
이렇게하면 텍스쳐 없는 오클루젼을 만들수 있다.(라이트맵처럼)
o.Emission = IN.color.rgb; // Emission
으로 출력
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

   

여러장 버텍스 텍스쳐사용

{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_MainTex2 ("Albedo (RGB)", 2D) = "white" {}
_MainTex3 ("Albedo (RGB)", 2D) = "white" {}
_MainTex4 ("Albedo (RGB)", 2D) = "white" {}


}

 

SubShader
{
Tags { "RenderType"="Opaque" }


CGPROGRAM

#pragma surface surf Standard noambient


sampler2D _MainTex;
sampler2D _MainTex2;
sampler2D _MainTex3;
sampler2D _MainTex4;

 

struct Input
{
float2 uv_MainTex;
float2 uv_MainTex2;
float2 uv_MainTex3;
float2 uv_MainTex4;
float4 color:COLOR;



};
<![if !supportLineBreakNewLine]>
<![endif]>

 

void surf (Input IN, inout SurfaceOutputStandard o)
{

fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 d = tex2D (_MainTex2, IN.uv_MainTex2);
fixed4 e = tex2D (_MainTex3, IN.uv_MainTex3);
fixed4 f = tex2D (_MainTex4, IN.uv_MainTex4);

o.Albedo = lerp(c.rgb, d.rgb, IN.color.r);
o.Albedo = lerp(o.Albedo, e.rgb, IN.color.g);
o.Albedo = lerp(o.Albedo, f.rgb, IN.color.b);

o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

Lambert 공식  (0) 2020.05.17
라이팅구조  (0) 2020.05.17
texture  (0) 2020.05.16
CGPROGRAM03  (0) 2020.05.16
CGPROGRAM02  (0) 2020.05.16

흑백이미지

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo =(c.r+c.g+c.g)/3;
o.Alpha = c.a;
}

   
       

UV 밀기

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex+0.5);
o.Albedo = c.rgb;
o.Alpha = c.a;
}

   
       

lerp함수

_MainTex ("텍스쳐1", 2D) = "white { }
_MainTex2 ("
텍스쳐2", 2D) = "white { }

Properties

lerp(X,Y,s)
X,Y
반드시 float, float1,float2,float3,float4형태
s
float 한자리수로 0~1이다.

 

sampler2D _MainTex;
sampler2D _MainTex2;

   
 

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 d = tex2D (_MainTex, IN.uv_MainTex2);

o.Albedo =lerp(c.rgb, d.rgb, 0.5);
o.Alpha = c.a;
}

2개의 텍스쳐를 혼합
선형 보간(그라데이션)

lerp(X, Y, s) s
float(숫자)이어야 합니다.

0.5
인하여 이미지가 반반씩 섞이게 됩니다.

 
 

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 d = tex2D (_MainTex, IN.uv_MainTex2);

o.Albedo =lerp(c.rgb, d.rgb, c.a);
o.Alpha = c.a;
}

알패 채널을 이용하여 두가지의 텍스쳐를 나오게 하는 방법.

o.Albedo =lerp(c.rgb, d.rgb, 1-c.a)
하면 반대로 뒤집힌다.
위엣것이랑 같은게 된다.o.Albedo =lerp(d.rgb, c.rgb, c.a)

 
       

lerp함수 비슷한거

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
fixed4 d = tex2D (_MainTex, IN.uv_MainTex2);

o.Albedo = c.rgb * d.rgb;
o.Alpha = c.a;
}

*으로 곱해줌.

o.Albedo = c.rgb * (d.rgb+_lerptest);
위에 프로버티를 그대로 적용하면 컬러가 섞인다.

 

 

유니티 쉐이더 스타트업 자료(정종필저)

'Unity > Surface Shader' 카테고리의 다른 글

라이팅구조  (0) 2020.05.17
Vertex color  (0) 2020.05.17
CGPROGRAM03  (0) 2020.05.16
CGPROGRAM02  (0) 2020.05.16
CGPROGRAM01  (0) 2020.05.16

변수

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color

float4 test = float4(1,0,0,1)

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = test;

o.Alpha = c.a;
}

빨란색이 출력

o.Albedo = test.rgb;
라고 써야 맞다. 이유는 rgb 사용하기 때문이다.

rgb
앞에 마침표는 내부에 들어갈 값이다.

.rgb
라고 쓰면 float3으로 변경되는것이다.

float4 test = float4(1,0,0,1)
위치가 위어야 정상으로 출력이된다.

void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color

float K = 1;
float G = float2(0.5,0);
float BB = float3(1,0,1);

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = float3(K,G,BB)

o.Alpha = c.a;
}

핑크 컬러 출력

o.Albedo = float3(0.2,G,1)
이런식으로 숫자를 넣어도 된다.

 

'Unity > Surface Shader' 카테고리의 다른 글

Vertex color  (0) 2020.05.17
texture  (0) 2020.05.16
CGPROGRAM02  (0) 2020.05.16
CGPROGRAM01  (0) 2020.05.16
Propeties  (0) 2020.05.16