Skip to content

Instantly share code, notes, and snippets.

@HarukaKajita
Created February 16, 2020 18:38
Show Gist options
  • Save HarukaKajita/82f357df4d2de4e3f8fec7b1677f0dc8 to your computer and use it in GitHub Desktop.
Save HarukaKajita/82f357df4d2de4e3f8fec7b1677f0dc8 to your computer and use it in GitHub Desktop.
ノイズによるプロシージャル法線マップシェーダー
Shader "Unlit/NoiseNormal"
{
Properties
{
_MatcapTex ("Matcap Tex", 2D) = "bump" {}
_NoiseScale ("Noise Scale", Range(0,100)) = 10
[KeywordEnum(Perlin, Value, Cell, Curl, fbm)] _NoiseType ("Noise Type", int) = 0
_NormalX ("Nroaml X", Range(-3,3)) = 0
_NormalY ("Nroaml Y", Range(-3,3)) = 0
_NoiseRange("Noise Range", Range(0,5)) = 0
_DispalacementHeight ("Displacement", Range(0,0.3)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"}
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Noise.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 normal : NORMAL;
float4 tangent : TANGENT;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD2;
float3 tangent : TEXCOORD3;
float3 binormal : TEXCOORD4;
float3 wPos : TEXCOORD5;
};
sampler2D _MatcapTex;
float4 _MatcapTex_ST;
float _NoiseScale;
int _NoiseType;
float _NormalX;
float _NormalY;
float _NoiseRange;
float _DispalacementHeight;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MatcapTex);
UNITY_TRANSFER_FOG(o,o.vertex);
o.normal = UnityObjectToWorldNormal(v.normal);
o.tangent = normalize(mul(unity_ObjectToWorld, v.tangent.xyz));
o.binormal = normalize(cross(o.normal, o.tangent) * v.tangent.w);
o.wPos = mul(unity_ObjectToWorld, v.vertex);
return o;
}
float getNoise (float2 uv, float scale){
float ret = 0;
if(_NoiseType == 0){
ret = pNoise(uv * scale);
} else if(_NoiseType == 1){
ret = valNoise(uv * scale);
} else if(_NoiseType == 2){
ret = cNoise(uv * scale);
} else if(_NoiseType == 3){
ret = curlNoise(uv * scale);
} else if(_NoiseType == 4){
ret = fbm(uv * scale);
}
return ret;
}
//線を書いてそこをベースに方線をいじる
//高さもいじる?
fixed4 frag (v2f i) : SV_Target
{
float3 wPos = i.wPos;
float3x3 tangentTransform = float3x3(i.tangent, i.binormal, i.normal);
float3 noiseNormal = normalize(float3(getNoise(i.uv, _NoiseScale)*2*_NoiseRange - _NoiseRange, getNoise(i.uv + 100, _NoiseScale)*2*_NoiseRange - _NoiseRange, 1));
// float3 noiseNormal = normalize(float3(_NormalX, _NormalY, 1));
float noiseValue = getNoise(i.uv, _NoiseScale);
float3 plainNormal = normalize(i.normal);
float3 displacementPos = wPos + plainNormal * noiseValue * _DispalacementHeight;
float3 crossNormal = normalize(cross(ddy(displacementPos), ddx(displacementPos)));
float3 bumpNormal = normalize(mul(noiseNormal, tangentTransform));
float3 normal = bumpNormal;//crossNormal;
float3 lDir = UnityWorldSpaceLightDir(wPos);
float3 vDir = UnityWorldSpaceViewDir(wPos);
float3 vNormal = mul((float3x3)UNITY_MATRIX_V, normal);
fixed4 matCapCol = tex2D(_MatcapTex, vNormal.xy*0.5 + 0.5);
fixed4 col = 1;
col.rgb *= dot(normal, lDir)*0.5+0.5;
col += matCapCol;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment