【ShaderGraph星球实战】制作尘埃星环

前言

        开个新坑,用ShaderGraph制作系列的星球,提供该方案的一种思路的参考

        行星渲染如果算原图,法线图,高光图三张的话,文件大小动辄几兆或者十几兆。如果要做多样化行星,需要更多贴图。

        为了解决上面问题本项目完全不采用任何贴图相对贴图方案,本项目优势有:

        1 文件体积非常小

        2 可以随机变幻星环外形,做到一个ShaderGraph产出N个外形

        3 不受贴图分辨率影响,高清渲染更好控制

        感兴趣的朋友可以留下来看看,特别是喜欢科幻或者太空题材的小伙伴。


目录

一、ShaderGraph图示

        1.1、实例图

        1.2、全流程图

二、ShaderGraph具体流程

        2.1、创建ShaderGraph

        2.2、vertex 端点

        2.3、Fragment 是插值      

        2.4、星环区域采集

        2.5、星环中心黑区

        2.6、星环区域

        2.7、星环色彩

        2.8、最终链接

三、ShaderGraph代码

        3.1、变量

        3.2、Tags

        3.3、Pass

        3.4、引用 

四、实例图示

五、总结


一、ShaderGraph图示

        ShaderGraph就不做介绍了。先上图,再确定是否继续往下看

        1.1、实例图

                尘埃星环


        1.2、全流程图


二、ShaderGraph具体流程

        2.1、创建ShaderGraph

 

        选择Lit ShaderGraph

        进入后可以看到这个


        2.2、vertex 端点

        object space 是可以链接物体的入口

        position 顶点位置(用于计算物体再空间中的坐标)

        normal 顶点法线(用于光照计算和渲染过程中,以模拟光线反射的效果)

        tangent 顶点的切线(用于控制顶点切线的方向和位置)


        2.3、Fragment 是插值      

        base color 基础颜色

        smoothness 物体表面细节的平滑程度

        normal 物体的片段法线(三点为一个面片)

        emission 物体自发光效果

        ambient occlusion 物体的环境光遮蔽

        metallic 物体的金属质感


        2.4、星环区域采集
  •   combine  

        是将多个纹理或颜色值以某种方式混合或结合的操作,这里我们将星换的色彩B区和透明度进行变量设定,从而得到一个可以影响视觉的达到变动形态的星环。 

        

        combine 在shader中

float shape =0.5f;
vec4 color1 = texture(texture1, texCoord);
vec4 color2 = texture(texture2, texCoord);
vec4 combinedColor = mix(color1, color2, shape ,shape ); // 将两个颜色以50%的比例混合,透明度改成0.5

  •    raction

通常用于一个数减去其整数部分后剩下的部分 

vec2 texCoord = fract(originalTexCoord); 

        使纹理坐标在 [0, 1] 范围内重复


  •   distance

        用于测量空间中两点之间的直线距离 

 在shader中计算两点之间的欧几里得距离

vec2 point1 = vec2(2.0, 5.0);
vec2 point2 = vec2(6.0, 16.0);
float dist = distance(point1, point2);

  •  noise sine wave

用于生成复杂的图案和动态效果 

在shader中可以表示为 

float random(vec2 st) {
    return fract(sin(dot(st, vec2(变量a, 变量b))) * 变量c);
}

float noise(vec2 st) {
    vec2 i = floor(st);
    vec2 f = fract(st);
    float a = random(i);
    float b = random(i + vec2(变量aa, 变量bb));
    float c = random(i + vec2(变量bb, 变量aa));
    float d = random(i + vec2(变量aa, 变量aa));
    vec2 u = f * f * (20 - 3.0 * f);
    return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
}

        2.5、星环中心黑区

        这段流程设置星环的中心区域,黑色区域可以避免遮挡星球渲染

  •   remap

        用于将输入值从原始范围线性映射到目标范围  

在shader中将一个值从 [0, 1] 映射到 [0, 255],或者从 [-1, 1] 映射到 [0, 1]

float norValue = 0.5; // 输入值在 [0, 1] 范围内
float remapValue = remap(normalizedValue, 0.0, 1.0, 0.0, 255.0);


  •   Power 

        幂运算是一个内置函数,用于计算一个数的幂  

// 标量
float pow(float x, float y);

// 向量
vec2 pow(vec2 x, vec2 y);
vec3 pow(vec3 x, vec3 y);
vec4 pow(vec4 x, vec4 y);

        x:底数,可以是标量或向量。

        y:指数,类型必须与 x 相同。


        2.6、星环区域

        制作三层不同尺寸形状的星环

  •  saturate

        确保值在合理范围内,避免出现意外的渲染结果

 

        在shader中的

float saturatedValue = clamp(x, 0.0, 1.0);

        用于将输入值限制在 [0, 1] 范围内。它的作用是将小于 0 的值截断为 0,大于 1 的值截断为 1,而在 [0, 1] 范围内的值保持不变


        2.7、星环色彩




        2.8、最终链接


三、ShaderGraph代码

        3.1、变量

        ShaderGraph 除了自己定义的变量,如,星环尺寸,星环厚度,星环颜色参数等。剩下是系统自己生成参数。

    Properties
    {
        _RingSize("RingSize", Float) = 0
        _RingShape("RingShape", Range(0, 10)) = 1.27
        [HDR]_Color_1("MainColor", Color) = (0, 0.2212648, 1, 0)
        [HDR]_Color_2("MidColor", Color) = (0, 0.5955162, 1, 0)
        _Color_3("OutColor", Color) = (0, 0.9226117, 1, 0)
        _RingCircleNum("RingCircleNum", Range(0, 5)) = 1
        _RingNoise("RingNois", Range(0, 5)) = 1
        [HideInInspector]_QueueOffset("_QueueOffset", Float) = 0
        [HideInInspector]_QueueControl("_QueueControl", Float) = -1
        [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
        [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
        [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
    }

        3.2、Tags
        Tags
        {
            "RenderPipeline"="UniversalPipeline"
            "RenderType"="Transparent"
            "UniversalMaterialType" = "Lit"
            "Queue"="Transparent"
            "DisableBatching"="False"
            "ShaderGraphShader"="true"
            "ShaderGraphTargetId"="UniversalLitSubTarget"
        }

        3.3、Pass
Pass
{
    Name "Universal Forward"
    Tags
    {
        "LightMode" = "UniversalForward"
    }

// Render State
Cull Off
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
ZTest LEqual
ZWrite Off

// Debug
// <None>

// --------------------------------------------------
// Pass

HLSLPROGRAM

// Pragmas
#pragma target 2.0
#pragma multi_compile_instancing
#pragma multi_compile_fog
#pragma instancing_options renderinglayer
#pragma vertex vert
#pragma fragment frag

        3.4、引用 
       // Includes
       #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
       #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
       #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
       #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
       #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
       #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
       #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
       #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"

        Shader Graph 中自定义代码

        如果有更复杂的需求(如动态加载资源),可以结合 Unity 的脚本功能实现


四、实例图示


五、总结

  •    在处理光照、阴影、粒子效果等场景时,distance来实现这一计算的工具非常有用,如距离进行调整,距离越远,光照强度越弱。
  •    从简单的动画到复杂的自然现象模拟,noise和 sine wave能够实现各种视觉效果。
  •    saturate可以使得一些复杂的参数得以去除,保留核心数据,类似将渲染约束化,比较常用。

写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学与用

原创作者,在线要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值