Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Shader "Customer/RayCast"
- {
- Properties{
- _Volume ("Volume (Scalar)", 3D) = "white"{}
- _TransferMap_Red ("TransferMap_Red", 2D) = "white"{}
- _TransferMap_Green ("TransferMap_Green", 2D) = "white"{}
- _TransferMap_Blue ("TransferMap_Blue", 2D) = "white"{}
- _TransferMap_Alpha ("TransferMap_Alpha", 2D) = "white"{}
- }
- SubShader {
- Tags { "Queue" = "Transparent" }
- Pass {
- Cull Back
- Blend SrcAlpha OneMinusSrcAlpha
- CGPROGRAM
- #pragma target 3.0
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct v2f
- {
- float4 pos : POSITION;
- float3 world_pos : TEXCOORD;
- };
- v2f vert(appdata_base v)
- {
- v2f output;
- output.pos = mul (UNITY_MATRIX_MVP, v.vertex);
- output.world_pos = mul(_Object2World, v.vertex).xyz;
- return output;
- }
- sampler3D _Volume;
- sampler2D _TransferMap_Red;
- sampler2D _TransferMap_Green;
- sampler2D _TransferMap_Blue;
- sampler2D _TransferMap_Alpha;
- float4 frag( v2f input ) : COLOR
- {
- float3 offset = float3(0.5f, 0.5f, 0.5f);
- float3 ray_step = 0.004f * float3(0.0f, 0.0f, 1.0f);//ortho camera look at positive z-axis.
- float3 start = input.world_pos;
- float4 dst = float4(0.0, 0.0, 0.0, 0.0);
- float value;
- float3 sample_pos = mul(_World2Object, float4(start.xyz, 1.0f));
- float4 sampled_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
- for(int i = 0; i < 50; ++i)
- {
- float3 world_pos = start + (i * ray_step);
- sample_pos = mul(_World2Object, float4(world_pos.xyz, 1.0f)).xyz + offset;//cube from unity is -0.5 to 0.5.
- value = tex3D(_Volume, sample_pos).a;
- 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)
- {
- if(value > 0.02 && dst.a < 0.98)
- {
- sampled_color.r = tex2D(_TransferMap_Red, float2(value, 0.5f)).a;
- sampled_color.g = tex2D(_TransferMap_Green, float2(value, 0.5f)).a;
- sampled_color.b = tex2D(_TransferMap_Blue, float2(value, 0.5f)).a;
- sampled_color.a = tex2D(_TransferMap_Alpha, float2(value, 0.5f)).a;
- dst = (sampled_color.a) * sampled_color + (1 - sampled_color.a) * dst;
- }
- }
- }
- if(dst.a < 0.05f)
- dst.a = 0.0f;
- return dst;
- }
- ENDCG
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement