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