프로퍼티에 새로운 함수를 작성하게 되면, 유니티 셰이더 인스펙터에 나타나요. 이 프로퍼티를 SubShader에서 적절하게 사용하면, 머테리얼의 컬러를 바꿀 수 있어요!
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
//테스트 컬러를 만들어주었다.
_TestColor("testcolor", Color) = (1,1,1,1)
}
SubShader
{
CGPROGRAM
half _Glossiness;
half _Metallic;
fixed4 _Color;
//테스트컬러 변수를 만들었다.
float4 _TestColor;
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
//o.Albedo에 테스트 컬러 변수를 넣었다. o.Emmision에도 적용이 가능하다
o.Albedo = _TestColor.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
참고로 코드는 필요한 일부를 강조하기 위해서 자른 부분이 많아요!! 그래서 이걸 가지고 가면, 작동 안돼요 !!
앞서 말씀드린 것 처럼, 프로퍼티에 _testColor를 작성했기 때문에 인스펙터에 추가가 됐고, o.Albedo에 적용을 해서 머테리얼 컬러를 변경할 수 있어요.
RGB 각각을 조절해서 컬러를 변경하기 위해서는 앞서 프로퍼티에서 했던 것 처럼 새로운 변수를 만들어야 해요. _Red, _Green, _Blue 그리고 SubShader에서도 똑같이 변수를 선언하구요. 이 후에 o.Albedo에 적용만 하면 돼요.
Properties
{
//테스트 컬러를 만들어주었다.
_Red("Red", Range(0,1)) = 0
_Green("Green", Range(0,1)) = 0
_Blue("Blue", Range(0,1)) = 0
}
SubShader
{
CGPROGRAM
//R, G, B 각각 조정하기 위해서 변수를 선언했다
float _Red, _Green, _Blue;
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
//R, G, B 각각 인스펙터에서 조절할 수 있다
o.Albedo = float3(_Red, _Green, _Blue);
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
이 또한 코드로 크게 어렵지 않아요! 반복 작업처럼 프로퍼티에 Brightness $ Darkness 코드를 작성하고, SubShader에 변수를 선언하고, 아까 작성한 컬러 코드에 더해주기만 하면 되죠~
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
//테스트 컬러를 만들어주었다.
_TestColor("testcolor", Color) = (1,1,1,1)
//RGB 각각 조절하기
_Red("Red", Range(0,1)) = 0
_Green("Green", Range(0,1)) = 0
_Blue("Blue", Range(0,1)) = 0
//색상을 밝게 혹은 어둡게 만들기
_BrightDark("Brightness $ Darkness", Range(-1,1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
//테스트컬러 변수를 만들었다.
float4 _TestColor;
//R, G, B 각각 조정하기 위해서 변수를 선언했다
float _Red, _Green, _Blue;
//Brightness $ Darkness 변수 선언
float _BrightDark;
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
//색상을 밝게 혹은 어둡게 만들기
o.Albedo = float3(_Red, _Green, _Blue) + _BrightDark;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
Shader "Custom/changeColor"
{
Properties
{
//테스트 컬러를 만들어주었다.
_TestColor("testcolor", Color) = (1,1,1,1)
//RGB 각각 조절하기
_Red("Red", Range(0,1)) = 0
_Green("Green", Range(0,1)) = 0
_Blue("Blue", Range(0,1)) = 0
//색상을 밝게 혹은 어둡게 만들기
_BrightDark("Brightness $ Darkness", Range(-1,1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
struct Input
{
float4 color : COLOR ;
};
//테스트컬러 변수를 만들었다.
float4 _TestColor;
//R, G, B 각각 조정하기 위해서 변수를 선언했다
float _Red, _Green, _Blue;
//Brightness $ Darkness 변수 선언
float _BrightDark;
void surf (Input IN, inout SurfaceOutputStandard o)
{
//o.Albedo에 테스트 컬러 변수를 넣었다. o.Emmision에도 적용이 가능하다
// o.Albedo = _TestColor.rgb;
//R, G, B 각각 인스펙터에서 조절할 수 있다
//o.Albedo = float3(_Red, _Green, _Blue);
//색상을 밝게 혹은 어둡게 만들기
o.Albedo = float3(_Red, _Green, _Blue) + _BrightDark;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
공부한 책: 유니티 쉐이더 스타트업