Shader "Custom/Triplanar"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Top("Top", 2D) = "white" {}
_Side("Side", 2D) = "white" {}
_Front("Front", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
sampler2D _Top;
sampler2D _Front;
sampler2D _Side;
struct Input
{
float2 uv_MainTex;
float3 worldPos;
float3 worldNormal;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
//fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float2 topUV = float2(IN.worldPos.x, IN.worldPos.z);
float2 sideUV = float2(IN.worldPos.z, IN.worldPos.y);
float2 frontUV = float2(IN.worldPos.x, IN.worldPos.y);
float4 topColor = tex2D(_Top, topUV); // green = 1
float4 sideColor = tex2D(_Side, sideUV); // red = 1
float4 frontColor = tex2D(_Front, frontUV); // blue = 1
//float3 n = WorldNormalVector(IN, o.Normal); //해당 면의 normal 벡터 => 값이 1이 된다.
//혼합 lerp
//float3 e = lerp(0, 1, topColor.g);
//o.Emission = topColor.rgb;
//o.Albedo = sideColor.rgb;
//o.Emission = n.rgb;
o.Albedo = lerp(topColor, frontColor,abs(IN.worldNormal.z));
//위쪽 면의 색상과 앞면의 색상을 표면의 기울기에 따라 가중 평균화하여 새로운 색상을 생성
//기울기가 높을수록 앞면의 색상이 더 많이 나타나며, 기울기가 낮을수록 위쪽 면의 색상이 더 많이 나타낸다.
o.Albedo = lerp(o.Albedo, sideColor, abs(IN.worldNormal.x));
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
그림과 같이 각 면이 해당하는 벡터를 확인한 후 색상을 집어 넣어야 한다.
Shader "Custom/Triplanar"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Top("Top", 2D) = "white" {}
_Side("Side", 2D) = "white" {}
_Front("Front", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
sampler2D _MainTex;
sampler2D _Top;
sampler2D _Front;
sampler2D _Side;
struct Input
{
float2 uv_MainTex;
float3 worldPos;
float3 worldNormal;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
//fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float2 topUV = float2(IN.worldPos.x, IN.worldPos.z);
float2 sideUV = float2(IN.worldPos.z, IN.worldPos.y);
float2 frontUV = float2(IN.worldPos.x, IN.worldPos.y);
float4 topColor = tex2D(_Top, topUV); // green = 1
float4 sideColor = tex2D(_Side, sideUV); // red = 1
float4 frontColor = tex2D(_Front, frontUV); // blue = 1
float3 n = WorldNormalVector(IN, o.Normal); //해당 면의 normal 벡터 => 값이 1이 된다.
//혼합 lerp
//float3 e = lerp(0, 1, topColor.g);
//e = lerp (e, topColor.r, sideColor);
//e = lerp (e, topColor.b, frontColor);
//o.Emission = topColor.rgb;
//o.Albedo = sideColor.rgb;
o.Emission = n.rgb;
//o.Albedo = lerp(topColor, frontColor,abs(IN.worldNormal.z));
//위쪽 면의 색상과 앞면의 색상을 표면의 기울기에 따라 가중 평균화하여 새로운 색상을 생성
//기울기가 높을수록 앞면의 색상이 더 많이 나타나며, 기울기가 낮을수록 위쪽 면의 색상이 더 많이 나타낸다.
//o.Albedo = lerp(o.Albedo, sideColor, abs(IN.worldNormal.x));
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html
Unity - Scripting API: Vector3.Lerp
Interpolates between the points a and b by the interpolant t. The parameter t is clamped to the range [0, 1]. This is most commonly used to find a point some fraction of the way along a line between two endpoints (e.g. to move an object gradually between t
docs.unity3d.com
'산대특 > 게임 UIUX 프로그래밍' 카테고리의 다른 글
Shader - Cubemap Reflection (0) | 2024.02.22 |
---|---|
Shader - Diffuse Warping (0) | 2024.02.22 |
Shader -Blinn Phong 스펙큘러 (0) | 2024.02.22 |
Shader - Lambert (0) | 2024.02.20 |
Shader - Vertex (0) | 2024.02.19 |