コード例
#ifndef VERT_FRAG_DEFERRED_OBJECT_STANDARD_H
#define VERT_FRAG_DEFERRED_OBJECT_STANDARD_H
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
#include "./Structs.cginc"
#include "./Raymarching.cginc"
#include "./Utils.cginc"
int _Loop;
float _MinDistance;
fixed4 _Color;
float _Glossiness;
float _Metallic;
#ifdef FULL_SCREEN
struct v2f
{
float4 pos : SV_POSITION;
float4 projPos : TEXCOORD0;
float4 lmap : TEXCOORD1;
#ifdef LIGHTMAP_OFF
#if UNITY_SHOULD_SAMPLE_SH
half3 sh : TEXCOORD2;
#endif
#endif
};
#else
struct v2f
{
float4 pos : SV_POSITION;
float3 worldPos : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
float4 projPos : TEXCOORD2;
float4 lmap : TEXCOORD3;
#ifdef LIGHTMAP_OFF
#if UNITY_SHOULD_SAMPLE_SH
half3 sh : TEXCOORD4;
#endif
#endif
};
#endif
v2f Vert(appdata_full v)
{
v2f o;
#ifdef FULL_SCREEN
o.pos = v.vertex;
#else
o.pos = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
#endif
o.projPos = ComputeNonStereoScreenPos(o.pos);
COMPUTE_EYEDEPTH(o.projPos.z);
#ifndef DYNAMICLIGHTMAP_OFF
o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
#else
o.lmap.zw = 0;
#endif
#ifndef LIGHTMAP_OFF
o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#else
o.lmap.xy = 0;
#ifndef SPHERICAL_HARMONICS_PER_PIXEL
#if UNITY_SHOULD_SAMPLE_SH
o.sh = 0;
o.sh = ShadeSHPerVertex(o.worldNormal, o.sh);
#endif
#endif
#endif
return o;
}
GBufferOut Frag(v2f i, GBufferOut o)
{
RaymarchInfo ray;
INITIALIZE_RAYMARCH_INFO(ray, i, _Loop, _MinDistance);
Raymarch(ray);
#ifdef USE_RAYMARCHING_DEPTH
o.depth = ray.depth;
#endif
float3 worldPos = ray.endPos;
float3 worldNormal = 2.0 * ray.normal - 1.0;
fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
SurfaceOutputStandard so;
UNITY_INITIALIZE_OUTPUT(SurfaceOutputStandard, so);
so.Albedo = _Color.rgb;
so.Metallic = _Metallic;
so.Smoothness = _Glossiness;
so.Emission = 0.0;
so.Alpha = _Color.a;
so.Occlusion = 1.0;
so.Normal = worldNormal;
#ifdef POST_EFFECT
POST_EFFECT(ray, so);
#endif
UnityGI gi;
UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
gi.indirect.diffuse = 0;
gi.indirect.specular = 0;
gi.light.color = 0;
gi.light.dir = half3(0, 1, 0);
gi.light.ndotl = LambertTerm(worldNormal, gi.light.dir);
UnityGIInput giInput;
UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
giInput.light = gi.light;
giInput.worldPos = worldPos;
giInput.worldViewDir = worldViewDir;
giInput.atten = 1;
#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
giInput.lightmapUV = i.lmap;
#else
giInput.lightmapUV = 0.0;
#endif
#if UNITY_SHOULD_SAMPLE_SH
#ifdef SPHERICAL_HARMONICS_PER_PIXEL
giInput.ambient = ShadeSHPerPixel(worldNormal, 0.0, worldPos);
#else
giInput.ambient.rgb = i.sh;
#endif
#else
giInput.ambient.rgb = 0.0;
#endif
giInput.probeHDR[0] = unity_SpecCube0_HDR;
giInput.probeHDR[1] = unity_SpecCube1_HDR;
#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION
giInput.boxMin[0] = unity_SpecCube0_BoxMin;
#endif
#if UNITY_SPECCUBE_BOX_PROJECTION
giInput.boxMax[0] = unity_SpecCube0_BoxMax;
giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
giInput.boxMax[1] = unity_SpecCube1_BoxMax;
giInput.boxMin[1] = unity_SpecCube1_BoxMin;
giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
#endif
LightingStandard_GI(so, giInput, gi);
o.emission = LightingStandard_Deferred(so, worldViewDir, gi, o.diffuse, o.specular, o.normal);
#ifndef UNITY_HDR_ON
o.emission.rgb = exp2(-o.emission.rgb);
#endif
UNITY_OPAQUE_ALPHA(o.diffuse.a);
return o;
}
#endif
Shader "Raymarching/Forward_HexFloor"
{
Properties
{
[Header(PBS)]
_Color("Color", Color) = (1.0, 1.0, 1.0, 1.0)
_Metallic("Metallic", Range(0.0, 1.0)) = 0.5
_Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
[Header(Pass)]
[Enum(UnityEngine.Rendering.CullMode)] _Cull("Culling", Int) = 2
[Header(Raymarching)]
_Loop("Loop", Range(1, 100)) = 30
_MinDistance("Minimum Distance", Range(0.001, 0.1)) = 0.01
_DistanceMultiplier("Distance Multiplier", Range(0.001, 2.0)) = 1.0
[PowerSlider(10.0)] _NormalDelta("NormalDelta", Range(0.00001, 0.1)) = 0.0001
[Header(Additional Properties)]
_TopColor("TopColor", Color) = (1, 1, 1, 0)
}
SubShader
{
Tags
{
"RenderType" = "Opaque"
"Queue" = "Geometry"
"DisableBatching" = "True"
}
Cull [_Cull]
CGINCLUDE
#define OBJECT_SHAPE_CUBE
#define USE_RAYMARCHING_DEPTH
#define SPHERICAL_HARMONICS_PER_PIXEL
#define DISTANCE_FUNCTION DistanceFunction
#define POST_EFFECT PostEffect
#define PostEffectOutput SurfaceOutputStandard
#include "Assets\uRaymarching\Shaders\Include\Legacy/Common.cginc"
inline float DistanceFunction(float3 pos)
{
float radius = 0.2;
float space = 0.1;
float wave = 0.1;
float3 objectScale = GetScale();
float height = objectScale.y * 0.5 - wave;
float3 scale = objectScale * 0.5;
float pitch = radius * 2 + space;
float3 offset = float3(pitch * 0.5, 0.0, pitch * 0.866);
float3 loop = float3(offset.x * 2, 1.0, offset.z * 2);
float3 p1 = pos;
float3 p2 = pos + offset;
float2 pi1 = floor(p1 / loop).xz;
float2 pi2 = floor(p2 / loop).xz;
pi1.y = pi1.y * 2 + 1;
pi2.y = pi2.y * 2;
p1 = Repeat(p1, loop);
p2 = Repeat(p2, loop);
float dy1 = wave * sin(10 * Rand(pi1) + 5 * PI * _Time.x);
float dy2 = wave * sin(10 * Rand(pi2) + 5 * PI * _Time.x);
float d1 = HexagonalPrismY(float3(p1.x, pos.y + dy1, p1.z), float2(radius, height));
float d2 = HexagonalPrismY(float3(p2.x, pos.y + dy2, p2.z), float2(radius, height));
loop.z *= 0.5;
float2 mpi1 = floor((scale.xz + float2(space * 0.5, radius)) / loop.xz);
float2 mpi2 = floor((scale.xz + float2(radius + space, radius)) / loop.xz);
float o1 = any(
step(mpi1.x, pi1.x) +
step(pi1.x + 1, -mpi1.x) +
step(mpi1.y, abs(pi1.y)));
d1 = o1 * max(d1, 0.1) + (1 - o1) * d1;
float o2 = any(step(mpi2, abs(pi2)));
d2 = o2 * max(d2, 0.1) + (1 - o2) * d2;
return d1;
}
float4 _TopColor;
inline void PostEffect(RaymarchInfo ray, inout PostEffectOutput o)
{
float3 localPos = ToLocal(ray.endPos);
o.Emission += smoothstep(0.48, 0.50, localPos.y) * _TopColor;
o.Occlusion *= 1.0 - 1.0 * ray.loop / ray.maxLoop;
}
ENDCG
Pass
{
Tags { "LightMode" = "Deferred" }
Stencil
{
Comp Always
Pass Replace
Ref 128
}
CGPROGRAM
#include "Assets\uRaymarching\Shaders\Include\Legacy/DeferredStandard.cginc"
#pragma target 3.0
#pragma vertex Vert
#pragma fragment Frag
#pragma exclude_renderers nomrt
#pragma multi_compile_prepassfinal
#pragma multi_compile ___ UNITY_HDR_ON
ENDCG
}
}
Fallback "Raymarching/Fallbacks/StandardSurfaceShader"
CustomEditor "uShaderTemplate.MaterialEditor"
}
仕組み