Shader "Custom/fake_reflection"
{
	Properties
	{
	_MainTex("Albedo (RGB)", 2D) = "white" {}
	_NormalMap("NormalMap", 2D) = "bump" {}
	_reflect("reflect", Range(-1,1)) = 0.9
	_CubeMap("CubeMap", cube) = "" {}
	}
		SubShader
	{
		Tags{ "RenderType" = "Opaque" }

		CGPROGRAM
#pragma surface surf Lambert 
#pragma target 3.0

		sampler2D _MainTex, _NormalMap;
		samplerCUBE _CubeMap;
		float _reflect;

	struct Input
	{
		float2 uv_MainTex, uv_NormalMap;
		float3 worldRefl;
		INTERNAL_DATA
	};

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

		o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));

		o.Albedo = c.rgb;
		o.Emission = texCUBE(_CubeMap, WorldReflectionVector(IN, o.Normal))*_reflect;

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

큐브맵이 있어야 작동한다.

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

적을 나타내는 아웃라인  (0) 2020.12.19
가벼운 툰 셰이더  (0) 2020.12.16
기본적인 일반텍스쳐+노멀+아웃라인 적용 쉐이더  (0) 2020.10.06
Alpha  (0) 2020.05.24
RampTexture  (0) 2020.05.21

뭔가 써먹으려고 만들었지만 써먹지 못한...

rhy_01.shader
0.00MB

 

 

 

뭔가 써먹으려고 만들었지만 써먹지 못한...

rhy_02.shader
0.00MB

 

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

가벼운 툰 셰이더  (0) 2020.12.16
가짜 리플렉션  (0) 2020.11.10
Alpha  (0) 2020.05.24
RampTexture  (0) 2020.05.21
OUTLINE  (0) 2020.05.17

       
 

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

   
 

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

   
 

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

   
       
 

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

   
 

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

   
 

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

   
 

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

   
 

알파 블렌딩을 사용하였을때에는 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

 

 

 

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

 

 

 

프레넬 공식

     
     

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