Shader "Unlit/Volume"
{
Properties
{
_Position("Position", Vector) = (0, 0, 0)
_Scale("Scale", Vector) = (0, 0, 0)
}
SubShader
{
Tags{"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}
HLSLINCLUDE
#include "Packages\com.unity.render-pipelines.universal\ShaderLibrary\Core.hlsl"
#define SAMPLES 100
#define MAX_DIST 100
#define SURF_DIST 0.001
CBUFFER_START(UnityPerMaterial)
float3 _Position;
float3 _Scale;
CBUFFER_END
struct VertexInput
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
struct VertexOutput
{
float4 pos : SV_POSITION;
float3 ro : TEXCOORD1;
float hitPos : TEXCOORD2;
float2 uv : TEXCOORD0;
};
ENDHLSL
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
VertexOutput vert(VertexInput i)
{
VertexOutput o;
o.pos = TransformObjectToHClip(i.pos.xyz);
o.ro = _WorldSpaceCameraPos;
o.hitPos = i.pos.xyz;
o.uv = i.uv;
return o;
}
float getDist(float3 p)
{
float d = length(p) - 0.5f;
return d;
}
float raymarch(float3 ro, float3 rd)
{
float dO = 0;
float dS;
for(int i = 0; i < SAMPLES; i++)
{
float3 p = ro + dO * rd;
dS = getDist(p);
dO += dS;
if(dS < SURF_DIST || dO > MAX_DIST)
break;
}
return dO;
}
float4 frag(VertexOutput i) : SV_Target
{
float2 uv = i.uv - 0.5f;
float3 rayOrigin = i.ro;
float3 rayDir = normalize(i.hitPos - rayOrigin);
float d = raymarch(rayOrigin, rayDir);
float4 col = 0;
if(d < MAX_DIST)
col.r = 1;
return col;
}
ENDHLSL
}
}
}