Advertisement
noradninja

Raycast shader

Nov 7th, 2023
858
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.04 KB | None | 0 0
  1. Shader "Customer/RayCast"
  2.     {
  3.     Properties{
  4.     _Volume            ("Volume (Scalar)", 3D) = "white"{}
  5.     _TransferMap_Red   ("TransferMap_Red", 2D) = "white"{}
  6.     _TransferMap_Green ("TransferMap_Green", 2D) = "white"{}
  7.     _TransferMap_Blue  ("TransferMap_Blue", 2D) = "white"{}
  8.     _TransferMap_Alpha ("TransferMap_Alpha", 2D) = "white"{}
  9.     }
  10.     SubShader {
  11.     Tags { "Queue" = "Transparent" }
  12.         Pass {
  13.             Cull Back
  14.             Blend SrcAlpha OneMinusSrcAlpha
  15.             CGPROGRAM
  16.             #pragma target 3.0
  17.             #pragma vertex vert
  18.             #pragma fragment frag
  19.             #include "UnityCG.cginc"
  20.            
  21.             struct v2f
  22.             {
  23.                 float4 pos : POSITION;
  24.                 float3 world_pos : TEXCOORD;
  25.             };
  26.  
  27.             v2f vert(appdata_base v)
  28.             {
  29.                 v2f output;
  30.                 output.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  31.                 output.world_pos = mul(_Object2World, v.vertex).xyz;
  32.                 return output;
  33.             }
  34.            
  35.             sampler3D _Volume;
  36.             sampler2D _TransferMap_Red;
  37.             sampler2D _TransferMap_Green;
  38.             sampler2D _TransferMap_Blue;
  39.             sampler2D _TransferMap_Alpha;
  40.             float4 frag( v2f input ) : COLOR
  41.             {  
  42.                 float3 offset = float3(0.5f, 0.5f, 0.5f);
  43.                 float3 ray_step = 0.004f * float3(0.0f, 0.0f, 1.0f);//ortho camera look at positive z-axis.
  44.                 float3 start = input.world_pos;
  45.                 float4 dst = float4(0.0, 0.0, 0.0, 0.0);
  46.                 float value;
  47.                 float3 sample_pos = mul(_World2Object, float4(start.xyz, 1.0f));
  48.                 float4 sampled_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
  49.                 for(int i = 0; i < 50; ++i)
  50.                 {
  51.                     float3 world_pos = start + (i * ray_step);
  52.                     sample_pos = mul(_World2Object, float4(world_pos.xyz, 1.0f)).xyz + offset;//cube from unity is -0.5 to 0.5.
  53.                     value = tex3D(_Volume, sample_pos).a;
  54.                     if(0.0 < sample_pos.x && 1.0 > sample_pos.x && 0.0 < sample_pos.y && 1.0 > sample_pos.y && 0.0 < sample_pos.z && 1.0 > sample_pos.z)
  55.                     {
  56.                         if(value > 0.02 && dst.a < 0.98)
  57.                         {
  58.                             sampled_color.r = tex2D(_TransferMap_Red,   float2(value, 0.5f)).a;
  59.                             sampled_color.g = tex2D(_TransferMap_Green, float2(value, 0.5f)).a;
  60.                             sampled_color.b = tex2D(_TransferMap_Blue,  float2(value, 0.5f)).a;
  61.                             sampled_color.a = tex2D(_TransferMap_Alpha, float2(value, 0.5f)).a;
  62.                             dst = (sampled_color.a) * sampled_color + (1 - sampled_color.a) * dst;
  63.                         }
  64.                     }
  65.                 }
  66.                 if(dst.a < 0.05f)
  67.                     dst.a = 0.0f;
  68.                 return dst;
  69.             }
  70.  
  71.             ENDCG
  72.         }
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement