Created
February 16, 2020 18:38
-
-
Save HarukaKajita/82f357df4d2de4e3f8fec7b1677f0dc8 to your computer and use it in GitHub Desktop.
ノイズによるプロシージャル法線マップシェーダー
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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