【ShaderGraph星球实战】制作岩石行星

前言

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

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

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

        1 文件体积非常小

        2 可以随机变幻星球的样貌,这是贴图很难做到的

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

        4 星球可以更好实现实时动态效果,比如地形的高低,地表痕迹

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


目录

一、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、地表的峰值与谷值

        2.9、各部分结合

三、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、物体空间坐标    

        取得物体的空间坐标


        2.5、行星地表山脉

         制作岩石星球的地表凹凸不平的山脉

       substract 减法效果,shader中是

float result = value1 - value2;

        sphere Mask 的基本原理是:

  •         计算当前像素点到某个中心点的距离。
  •         根据距离与设定的半径范围,计算遮罩强度。
  •         通常使用平滑插值(如 smoothstep)来实现柔和的过渡效果。

        然后做一下地表山脉的法线,让它有突起的质感

         法线得高度和强度,这个很好理解


        2.6、行星地表陨石坑

         行星会受到陨石撞击,留下陨石坑,为了更还原行星地表,必须留下几个陨石坑

  float step(edge, x);  如果 x < edge,返回 0。如果 x >= edge,返回 1。

        在shader中

float step(float edge, float x);
float2 step(float2 edge, float2 x);
float3 step(float3 edge, float3 x);
float4 step(float4 edge, float4 x);

        接着做小陨石坑,有大陨石坑,还得来些小陨石坑

        最后设置一下陨石坑的法线,让它凹凸有质感

        


        2.7、行星地表斑驳不平

        岩石行星经过亿万年的撞击,脸上已经磨皮,得加些岁月感

        左边是灰度,右边是法线


        2.8、地表的峰值与谷值

        有了地表凹凸的基础灰度和法线,就可以设置它们的海平高低

        Multiply 值相乘,shader中使用

result = color1 * color2

        主要让颜色或纹理产生变化

  •    颜色加深:将纹理与颜色相乘,可以使纹理变暗。
  •    遮罩效果:将纹理与遮罩图相乘,可以实现局部遮罩

        2.9、各部分结合

        有了山脉,陨石坑,斑驳地表,最后链接坐标,输出渲染,法线三个节点。


三、ShaderGraph代码

        3.1、变量

        ShaderGraph 除了自己定义的变量,如,地形高度,山脉参数,陨石坑参数等。剩下是系统参数。

    Properties
    {
        _Terrain("Terrain", Range(1, 1.5)) = 1
        _SmallMeteorCrater("SmallMeteorCrater", Range(1, 3)) = 1
        _BigMeteorCrater("BigMeteorCrater", Range(5, 20)) = 5
        _BigMeteorCraterScale("BigMeteorCraterScale", Range(2, 5)) = 2
        _MoutainHigh("MoutainHigh", Range(1, 1.5)) = 1.33
        [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"="Opaque"
            "UniversalMaterialType" = "Lit"
            "Queue"="Geometry"
            "DisableBatching"="False"
            "ShaderGraphShader"="true"
            "ShaderGraphTargetId"="UniversalLitSubTarget"
        }

        3.3、Pass 
 Pass
 {
     Name "Universal Forward"
     Tags
     {
         "LightMode" = "UniversalForward"
     }
 
 // Render State
 Cull Back
 Blend One Zero
 ZTest LEqual
 ZWrite On
 
 // 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、引用 
        #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/PBRForwardPass.hlsl"
        
        // --------------------------------------------------
        // Visual Effect Vertex Invocations
        #ifdef HAVE_VFX_MODIFICATION
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl"

         自动生成了很多引用,看看理解下就好了

        #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 的脚本功能实现


四、实例图示


五、总结

  •    实现山脉的不规则形状需要用到噪点。
  •    凹凸的地表需要用到法线坐标和物体空间坐标。
  •    根据表现得具体情况,山脉,陨石坑,斑驳地表灰度和法线不需要同步结合。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学与用

原创作者,在线要饭

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

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

打赏作者

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

抵扣说明:

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

余额充值