【Shader】 볼륨 렌더링으로 3D 노이즈를 가시화한다

14712 단어 ShaderShaderLabUnity

소개



볼륨 렌더링은 구름 표현이나 CT, MRI 이미지 등에 사용되는 렌더링 방식입니다.
이 볼륨 렌더링과 3D 노이즈를 결합하여 놀아갑니다.

완성



메쉬에는 프리미티브의 Cube를 사용하고 있습니다. 볼륨 렌더링을 적용하는 것으로, 마치 Cube에 내용이 있는 것 같은 표현이 되어 있다고 생각합니다
치유되는구나~~


Cube3개


소스 코드



참고로 받은 기사나 GitHub의 소스를 잘라 붙인 정도의 내용입니다
이번에는 유선 표현에 이용되는 컬 노이즈를 사용합니다.SimplexNoise.cginc는 Keijiro의 SimplexNoise3D.hlsl을 사용합니다.

VolumeCurlNoise.shader
Shader "Volume/CurlNoise" {
    Properties {
        [HDR] _Color ("Color", Color) = (1,1,1,1)
        _Size ("Size", Range(0, 10)) = 1.0
        _Iteration("Iteration", Int) = 10
        _Intensity("Intensity", Range(0, 1)) = 0.1
    }
    SubShader {
        Tags { "RenderType"="Transparent" "RenderQueue"="Transparent" }
        Cull Off
        ZWrite Off

        CGPROGRAM
        #pragma surface surf Lambert alpha vertex:vert
        #include "SimplexNoise.cginc"

        struct Input {
            float3 worldPos;
            float3 localPos;
            float3 viewDir;
        };

        fixed4 _Color;
        int _Iteration;
        fixed _Intensity;
        fixed _Size;

        float3 curlnoise(float3 p) {
            const float e = 0.009765625;
            const float e2 = 2.0 * e;

            float3 dx = float3(e, 0., 0.);
            float3 dy = float3(0., e, 0.);
            float3 dz = float3(0., 0., e);

            float3 p_x0 = snoise(p - dx);
            float3 p_x1 = snoise(p + dx);
            float3 p_y0 = snoise(p - dy);
            float3 p_y1 = snoise(p + dy);
            float3 p_z0 = snoise(p - dz);
            float3 p_z1 = snoise(p + dz);

            float x = p_y1.z - p_y0.z + p_z0.y;
            float y = p_z1.x - p_z0.x + p_x0.z;
            float z = p_x1.y - p_x0.y + p_y0.x;
            return normalize(float3(x, y, z) / e2);
        }

        void vert (inout appdata_full v, out Input data) {
            UNITY_INITIALIZE_OUTPUT(Input,data);
            data.localPos = v.vertex;
            data.worldPos = mul(unity_ObjectToWorld, v.vertex);
        }

        void surf (Input IN, inout SurfaceOutput o) {
            float3 wdir = IN.worldPos - _WorldSpaceCameraPos;
            float3 ldir = normalize(mul(unity_WorldToObject, wdir));
            float3 lstep = ldir / _Iteration;
            float3 lpos = IN.localPos;
            fixed output = 0.0;

            [loop]
            for (int i = 0; i < _Iteration; ++i)
            {
                fixed a = curlnoise((lpos + 0.5) * _Size).r;
                output += (1 - output) * a * _Intensity;
                lpos += lstep;
                if (!all(max(0.5 - abs(lpos), 0.0))) break;
            }

            fixed4 c = _Color * output;

            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

참고



Unity에서 볼륨 렌더링 시도 - vol.1 데이터 표시
Noise Shader Library for Unity
Curl Noise 써 보았다

좋은 웹페이지 즐겨찾기