간단 유니티 와 서브스턴스 테스트.



기존 B2M 외에 몇가지 쉐이더를 만들면서 서브스턴스 유니티 연동 계속 진행 합니다.


쩝... 아직 라이트 다이렉션에 대한 계산을 넣지 않았기 때문에 뷰백터에 따른 맷켑 정도가 암비언트 라이팅을 대신 하고 있는데요...


모바일에서 적정한 무리 없는 선에서 최적화 하면서 만들기 때문에 삐까번쩍하게는 솔직히 힘들죠.


그래서 일단 서브스턴스 모바일 버전을 함께 만들기로 했는데요...


이제 막 몇가지 파라메터들을 추가 하고 있습니다.





메트릭스와 파라메터를 크게 추가 하지 않고 연산을 줄이기 위해 룩업 텍스처 기반으로 림라이팅을 구현 한 후

림 컬러를 위해 컬러 베이스로 여러가지 스피어 램프맵을 구성 해 보았다.
InvertY 에 대한 레인지를 가지고 기존 노멀맵의 Y 축 반전을 처리 하도록 해 놨습니다.

-1 부터 1 까지 ... 따로 커스텀 메트리얼 인스펙터를 만들고 컴포넌트를 또 붙히고 하면 true false 로 나눌 수 있는데요. 번거롭고 어차피 -1 과 1 값만 가지고 normal.y 에 값을 넘겨 주고 처리 하면 되니까요.







모바일에서 테스트 후 좀 더 개선 하고 데이터 올려 보도록 하죠.
여기에 서브스턴스의 기능을 좀 더 결합 하는 방향을 잡아 보려고 함.

// MatCap Shader, (c) 2013 Jean Moreno
//MatCap Shader Ghost based Texture unit added Customizing Author (c) 2013 JP.Lee

Shader "MatCap/Vertex/Textured Multiply_Rim_Bumped"
{
Properties
{
_MainTex ("Diffuse (RGB)", 2D) = "white" {}
_NormalTex("Normal (RGB)", 2D) = "white" {}
_InvertY("Invert_Y" , Range(-1,1)) = 0

_MatCap ("MatCap (RGB)", 2D) = "white" {}
_MatCapBlendFactor ("MatCap Blend Factor" , float) = 1
_MatRim ("RimTex (RGB)", 2D) = "white" {}
_RimPower ("RimPower", float) = 1
_RimColor("Rim Color" , Color) = (1 , 1 , 1 , 1)


}

Subshader
{
Tags { "RenderType"="Opaque" }
Pass
{


Tags { "LightMode" = "Always" }


CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

struct v2f
{
float4 pos : SV_POSITION;
float2 uv  : TEXCOORD0;
float2 uv_bump : TEXCOORD1;

float3 c0 : TEXCOORD2;
float3 c1 : TEXCOORD3;

};

uniform float4 _MainTex_ST;
uniform float4 _NormalTex_ST;


v2f vert (appdata_tan v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv_bump = TRANSFORM_TEX(v.texcoord,_NormalTex);

TANGENT_SPACE_ROTATION;
o.c0 = mul(rotation, UNITY_MATRIX_IT_MV[0].xyz);
o.c1 = mul(rotation, UNITY_MATRIX_IT_MV[1].xyz);

return o;
}

uniform sampler2D _MainTex;
uniform sampler2D _NormalTex;
uniform sampler2D _MatCap;
uniform sampler2D _MatRim;

uniform float _InvertY;
uniform float _RimPower;
uniform fixed _MatCapBlendFactor;

uniform fixed4 _RimColor;





fixed4 frag (v2f i) : COLOR
{
fixed4 tex = tex2D(_MainTex, i.uv);
fixed3 normals = UnpackNormal(tex2D(_NormalTex, i.uv_bump));

normals = float3(normals.x , normals.y * _InvertY , normals.z);

fixed2 capCoord = half2(dot(i.c0, normals), dot(i.c1, normals));

float4 mc = tex2D(_MatCap, capCoord*0.5+0.5) * _MatCapBlendFactor;
fixed4 mcRim = tex2D(_MatRim, capCoord*0.5+0.5) *_RimColor;

return tex * mc * 2.0 + (mcRim * _RimPower);


}
ENDCG
}
}

Fallback "VertexLit"
}

서브스턴스 에서 노말인버스 구현 하여 추가.
아래와 같은 노드 베이스를 갖추고 있어야 함.



수정 되어 적용 된 B2M 커스텀 메트리얼.


 Game Developer Leegoon copyright all right reserved since 2010.

Comments