【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现图形太阳_Sun】

简介: 【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现图形太阳_Sun】

Shader"ShaderToy/Sun"
{
    Properties
    {
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            fixed4 fragColor;
            float4 _iMouse;

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float4 screenCoord : TEXCOORD1;
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.screenCoord.xy = ComputeScreenPos(o.vertex);
                return o;
            }
            #define urx 1920U
            #define ury 1080U
            #define pi 3.141592654
            //sun
            #define sunCenter fixed3(0.0,0.0,0.0)
            #define sunRad .25
            #define fracalIterations 4
            #define fracalScale 10.0
            #define fracalFreq 2.0
            #define sunBrightness .87
            #define redMean .55
            #define greenMean .35
            #define blueMean .0
            //corona
            #define coronaCol fixed3(.8, .5, .1)
            #define coronaDropOff 15.0

            fixed iSphere(fixed3 ray, fixed3 dir, fixed3 center, fixed radius)
            {
                fixed3 rc = ray-center;
                fixed c = dot(rc, rc) - (radius*radius);
                fixed b = dot(dir, rc);
                fixed d = b*b - c;
                fixed t = -b - sqrt(abs(d));
                fixed st = step(0.0, min(t,d));
                return lerp(-1.0, t, st);
            }


            fixed4 iPlane(fixed3 ro, fixed3 rd, fixed3 po, fixed3 pd){
                fixed d = dot(po - ro, pd) / dot(rd, pd);
                return fixed4(d * rd + ro, d);
            }

            fixed3 r(fixed3 v, fixed2 r){//rodolphito's rotation
                fixed4 t = sin(fixed4(r, r + 1.5707963268));
                fixed g = dot(v.yz, t.yw);
                return fixed3(v.x * t.z - g * t.x,
                v.y * t.w - v.z * t.y,
                v.x * t.x + g * t.z);
            }

            fixed hash(uint n){//Hugo Elias's hash
                n = (n << 13U) ^ n;
                n = n * (n * n * 15731U + 789221U) + 1376312589U;
                return 1.0 - fixed(n & 0x7fffffffU)/fixed(0x7fffffff);
            }

            fixed hashNoise3(fixed3 x){
                fixed3 fr = frac(x);
                fr = smoothstep(0.0, 1.0, fr);
                fixed3 p = fixed3(x);
                return lerp(lerp(lerp(hash(p.x + ury * p.y + urx * p.z), 
                hash(p.x + 1U + ury * p.y + urx * p.z),fr.x),
                lerp(hash(p.x + ury * (p.y + 1U) + urx * p.z), 
                hash(p.x + 1U + ury * (p.y + 1U) + urx * p.z),fr.x),fr.y),
                lerp(lerp(hash(p.x + ury * p.y + urx * (p.z + 1U)), 
                hash(p.x + 1U + ury * p.y + urx * (p.z + 1U)),fr.x),
                lerp(hash(p.x + ury * (p.y + 1U) + urx * (p.z + 1U)), 
                hash(p.x + 1U + ury * (p.y + 1U) + urx * (p.z + 1U)),fr.x),fr.y),fr.z);
            }

            fixed fracalNoise3(fixed3 pos){
                fixed acc = 0.0;
                fixed scale = 1.0;
                [unroll(100)]
                for(int n = 0; n < fracalIterations; n++){
                    acc += hashNoise3(scale * pos) / scale;
                    scale  = mul(        scale ,2.0);
                }
                return acc / 2.0;
            }

            fixed3 colorSun(fixed x){
                fixed3 result = fixed3(0.0,0.0,0.0);
                result.x += exp(-(x - redMean) * (x - redMean) * 16.0);
                result.y += exp(-(x - greenMean) * (x - greenMean) * 16.0);
                //result.z += exp(-(x - blueMean) * (x - blueMean) * 16.0);
                if(result.y > .5) result.x += result.y;
                return result;
            }

            fixed3 render(fixed3 rd, fixed3 ro)
            {
                fixed d = iSphere(ro, rd, sunCenter, sunRad);
                if(d > 0.0){
                    fixed3 n = normalize(d * rd + ro - sunCenter);
                    fixed f = fracalNoise3(fracalScale * n + (.3 + .2 * sin(fracalFreq * _Time.y)
                    + fracalFreq * fixed3(_Time.y + 13.0,_Time.y + 13.0,_Time.y + 13.0)));
                    fixed3 col = colorSun(f);
                    return col + dot(rd, n) * (1.0 - sunBrightness);
                }
                else{
                    fixed4 intersect = iPlane(ro, rd, sunCenter, normalize(sunCenter - ro));
                    return pow(coronaCol, coronaDropOff * (length(intersect.xyz - sunCenter) - sunRad));
                }
            }

            fixed4 frag(v2f i) : SV_Target
            {

                fixed2 xy = (2.0 * i.uv - 1) / 1;
                fixed3 cam = fixed3(0.0, 0.0, -1.0);
                fixed3 dir = normalize(fixed3(xy, 2.5));
                fixed2 m = (2.0 * _iMouse.xy - 1) / 1;
                m  = mul(    m ,2.0);
                dir = r(dir, m);
                cam = r(cam, m);
                fragColor.xyz = render(dir, cam);

                return fragColor;
            }
            ENDCG
        }
    }
}


相关文章
|
13天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享_Hexagon】
【ShaderToy中图形效果转译到UnityShaderlab案例分享_Hexagon】
|
12天前
|
图形学 异构计算 Windows
【ShaderToy中图形效果转译到UnityShaderlab系列案例分享】
【ShaderToy中图形效果转译到UnityShaderlab系列案例分享】
|
12天前
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现粒子场_ParticleField】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现粒子场_ParticleField】
|
12天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现七彩动画光圈_ColorfulCircle】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现七彩动画光圈_ColorfulCircle】
|
12天前
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现景深透视万花筒_Cave】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现景深透视万花筒_Cave】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现景深透视万花筒_Cave】
|
12天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享,代码实现渐变火焰扰动_Flame】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,代码实现渐变火焰扰动_Flame】
|
12天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现万花筒变异_Kaleidoscope】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现万花筒变异_Kaleidoscope】
|
13天前
|
图形学
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现三原色型变效果_Chromatic Aberration】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现三原色型变效果_Chromatic Aberration】
|
12天前
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现圆形图像变异_Animation】
【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现圆形图像变异_Animation】
|
数据可视化
Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的。其中就包括华丽绚烂的三维图表,数据量不大的时候是可以使用的。前面介绍了基础的q3d散点图、柱状图,本篇介绍基础的三维曲面图。Q3DSurface类提供了渲染3D曲面图的方法。该类使开发人员能够渲染3D表面图,并通过自由旋转场景来查看它们。可以通过QSurface3DSeries控制曲面的视觉财产,例如绘制模式和着色。

热门文章

最新文章