首页 > 其他分享 >【ShaderGraph星球实战】制作类地行星

【ShaderGraph星球实战】制作类地行星

时间:2025-01-17 13:03:38浏览次数:3  
标签:normal float 混合 unity 类地行星 行星 ShaderGraph 星球

前言

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

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

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

        1 文件体积非常小

        2 可以随机变幻星球的样貌,这是贴图很难做到的,可以更好实现实时动态效果,比如地形的高低,海面,地表痕迹

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

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


目录

一、ShaderGraph图示

        1.1、实例图

        1.2、全流程图

二、ShaderGraph具体流程

        2.1、创建ShaderGraph

        2.2、vertex 端点

        2.3、Fragment 是插值      

        2.4、行星地貌

        2.5、行星山脉

        2.6、行星雪峰

        2.7、最终链接

三、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、行星地貌

        类地行星中有着复杂地貌,我们用以下节点铺设地貌

  •    one minus   

        表示用1减去某个值。通常用于颜色计算、透明度处理、反射率计算等,为实现各种视觉效果。

        shader 中类似的效果

float alpha = 1.0 - textureColor.a;

  •    Sphere Mask 

         用于生成一个球形遮罩效果。常用于实现局部光照、特效、或者将某个区域限制在球形范围内。

     shader 中类似的效果

    float distanceTocenter = length(fragWorldPos - sphereCenter);

    float mask = smoothstep(sphereRadius, sphereRadius - smoothness, distanceTocenter 
  
    gl_FragColor = vec4(mask, mask, mask, tempNum);    // 应用遮罩值到颜色输出

        sphereCenter:球心的坐标的三维向量
        sphereRadius:球的半径
        smoothness:遮罩边缘的平滑度
        fragWorldPos:片元的世界坐标


  • normal from height

        是法线高度图,在图中每个像素的亮度值表示表面的高度。可以计算出表面的法线向量,从而用于光照计算等效果,渲染高低视觉。

在shader 中

    // 采样当前像素和相邻像素的高度
    float heightCenter = texture(heightMap, texCoords).r;
    float heightRight = texture(heightMap, texCoords + vec2(texelSize.x, 0.0)).r;
    float heightUp = texture(heightMap, texCoords + vec2(0.0, texelSize.y)).r;
    float dHeightRight = (heightRight - heightCenter) * heightScale;
    float dHeightUp = (heightUp - heightCenter) * heightScale;
    vec3 normal;
    normal.x = -dHeightRight;
    normal.y = -dHeightUp;
    normal.z = 1.0;
    normal = normalize(normal);

        2.5、行星山脉

        渲染类型行星地貌更为复杂的山脉

  • normal vector

        用于描述表面的朝向,垂直于表面,并且在光照计算、反射、折射等效果中起着关键作用。

         在shader 中

mat3 normalMatrix = transpose(inverse(mat3(modelViewMatrix)));
vec3 worldNormal = normalMatrix * normal;

        2.6、行星雪峰

        给类型行星添加雪峰效果,让看起来更真实


  •    blend

        用于控制片元颜色与帧缓冲区中已有颜色如何结合的技术。混合通常用于实现透明效果、叠加效果、以及其他颜色混合操作。
 

在shader中

Blend SrcAlpha OneMinusSrcAlpha//Alpha 混合
Blend One One//加法混合
Blend DstColor Zero//乘法混合
Blend SrcAlpha OneMinusSrcAlpha, One One//自定义混合

///-----------------------------

glEnable(GL_BLEND);// 启用混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// 设置混合函数
glBlendEquation(GL_FUNC_ADD);// 设置混合方程

        2.7、最终链接


三、ShaderGraph代码

        3.1、变量

        ShaderGraph 除了自己定义的变量,如,行星陆地,行星山脉,行星雪峰参数等。剩下是系统自己生成参数。

    Properties
    {
        _LandScale("LandScale", Range(-0.8, 0.2)) = -0.65
        _Land("Land", Range(-15, 30)) = 1
        _Treeland("Treeland", Range(10, 100)) = 10
        _MountainHigh("MountainHigh", Range(0, 2)) = 1.331
        _SeaColor("SeaColor", Color) = (0.07111073, 0.1009527, 0.8867924, 0)
        [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/ShaderLibrary/UnityGBuffer.hlsl"
        #include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/PBRGBufferPass.hlsl"
        
        // --------------------------------------------------
        // Visual Effect Vertex Invocations
        #ifdef HAVE_VFX_MODIFICATION
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl"

        Shader Graph 中自定义代码

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


四、实例图示


五、总结

  • 混合是着色器编程中实现透明、叠加等效果的关键技术。

  • 通过设置源因子和目标因子,可以控制源颜色和目标颜色的混合方式。

  • 常见的混合模式包括 Alpha 混合、加法混合、乘法混合等。

  • 在 Unity 和 OpenGL 中,可以通过 Blend 指令或 glBlendFunc 函数来配置混合行为。

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

标签:normal,float,混合,unity,类地行星,行星,ShaderGraph,星球
From: https://blog.csdn.net/longstar777/article/details/145153160

相关文章

  • 痞子衡嵌入式:我评上了2024年度电子星球(eestar)最强大脑
    今天收到了「电源网旗下电子星球」颁发的2024年度最强大脑奖牌,这是电子星球第二年给痞子衡颁奖了。这个奖牌设计得非常用心,区别于去年奖牌只能捧在手上,今年痞子衡可以把奖牌挂脖子上出去拉风了。从23年8月开始,电子星球小编每个工作日会转发一篇痞子衡的技术原创文章,直到24年6......
  • 某个知识星球 X-Signature
    1.搜索大法,屡试不爽 2. 加密参数 3. 加密接口  4.加密数据  算法实现:importhashlibdefsha1(data):#创建一个SHA1散列对象sha1=hashlib.sha1()#更新散列对象以包含数据sha1.upda......
  • BP 神经网络在星球表面特征识别中的应用
    BP神经网络在星球表面特征识别中的应用一、引言在人类对宇宙探索的征程中,对各个星球表面特征的精准识别与深入了解至关重要。无论是火星的沙丘、陨石坑,月球的环形山、平原,还是其他天体上独特的地质构造、矿物分布等,这些表面特征都蕴藏着星球形成、演化以及潜在宜居性等诸......
  • 星球助手发布更新v1.3.0
    星球助手发布更新v1.3.0,重要的更新内容有"导出"模块可以按照天或者月进行合并导出到一个文件."搜索"模块的搜索输入框旁边展示搜出的帖子数量.添加文档,请阅读官网的”星球助手/常见问题“页面如何备份数据如何判断某个星球的帖子下载完全如何按日期下载星球的帖子下载的......
  • 沉淀中,由于翻译校对太花时间,所以更多的还是做个人精简版笔记,THM博客留着慢慢填坑&如需
    对于无法直接发布或者较敏感的文章,将使用密码保护机制。博客主页的背景图片可能需要挂载VPN工具才能成功刷新。⭐需要PDF版THM笔记的可以加一下下面的知识星球,主要包含个人校对的TryHackMe中文笔记PDF版、闲鱼购买的SRC教程、网上白嫖的一些学习资源。......
  • ShaderGraphs和ASE对比
      大家好,我是阿赵。  之前我写了一些关于Unity可视化Shader编写工具AmplifyShaderEditor(简称ASE)的使用介绍的文章。有不少网友给我留言,内容主要有2点:怎么我的Unity里面没有ASE插件?为什么要用ASE?用ShaderGraph应该会更好?  我个人的看法,使用什么工具是次要的,理解思......
  • 星球助手发布最新版本v1.1.0
    星球助手发布最新版本v1.1.0,本次更新主要有​添加了对"搜索结果"的批量导出,和按照月份批量导出,支持导出为PDF,docx,markdown格式.搜索功能支持搜索特定的星球,支持仅搜索星主的帖子.添加一键发送软件错误日志的功能,方便排查定位软件错误.对帖子内容里的#链接和网......
  • 奇酷星球 1.1.2 | 免费听歌神器,三条音源,可下载
    奇酷星球(DX云音乐)是一款优质的音乐播放器,拥有强大的音乐库,涵盖了各种风格和国家的音乐作品。无论你喜欢流行曲、古典乐、摇滚还是电子音乐,都能在这里找到满足自己音乐口味的作品。大小:35M下载地址:百度网盘:https://pan.baidu.com/s/10UjSltMTA-skHb7CUrDOEw提取码:cizu......
  • WebGL实现soul星球效果
    WebGL实现soul星球效果最近在研究webGL,觉得soulapp的星球挺有意思的,于是就实现了一下,中间涉及的细节和知识点挺多的,写篇博客分享一下soul原版WebGL实现的jcode主要技术要点1.使用黄金分割数螺旋分配使小球在球表面均匀分布使用不同的goldenRatio可以得到非常多分......
  • 用星球助手下载帖子的手把手教程
    当我们想要把星球里的帖子和附件下载到本地电脑上慢慢学习时,一篇一篇下载太麻烦了,耗时且无聊.用星球助手就非常方便啦.打开软件后,就是这样的界面.点击"新增",输入星球名字和网页链接.就像这样.最后,就是点击"启动"开启一键下载了.帖子,图片,附件,全都保存在......