当前位置: 首页 > news >正文

ShaderForge插件分享

一、前言

请输入图片描述
ShaderForge是一款为Unity所用的、基于节点操作的Shader插件。笔者一直想写一篇关于ShaderForge的教程,希望可以分享给想学习Shader的美术。通过该插件,美术不需要编写代码就可以制作Shader。同时笔者也希望Shader程序员能客观看待这款插件,美术效果和代码优化需要美术和程序的共同配合来完成。

本文主要从插件使用和代码优化两个方面来介绍ShaderForge在手机游戏上的应用。


二、ShaderForge插件使用

官方主页:http://www.acegikmo.com/shaderforge/
通过ShaderForge新建Shader后,会提供一些Shader模板,创建对应于不同光照模型的Shader。
请输入图片描述

ShaderForge的默认用户界面分为预览、Shader设置(名称、属性、光照模型、几何绘制、混合模式)、节点连线编辑面板、节点列表。

节点连线编辑面板

1. Main节点
在新建Shader文件时,默认会有一个唯一的Main节点,用于输出材质效果。大家可以参考Unite2014-ShaderForge教程进行整理,链接如下:
https://www.youtube.com/watch?v=WMHpBpjWUlY
请输入图片描述

基本输出会根据 Lighting 设置中的所选的不同光照模型(Unlit/Custom、Blinn-Phong、Phong、PBL)进行计算。
请输入图片描述

无光照的情况下 FinalColor.rgb = Emission。

使用光照模型的情况下 FinalColor.rgb = Diffuse + Specular + Emission,Normal用于Diffuse和Specular的光照计算。

手机游戏使用光照 一般使用 Forward 前向渲染,使用光照模型 Blinn-Phong ,会计算漫反射、环境光和高光。 Light Count 代表接受单个光源Single Directional还是多个光源Multi-light的影响。 Lightmap & light probes 代表可参与光照烘焙。 Receive Ambient Light 代表接受Lighting面板中设置的环境光的影响。

光照部分的输出 用于在基本光照模型上添加间接光照(Ambient Light和Ambient Occlusion)或者改变光照模型使用自定义光照模型(Custom Lighting)。

以Diffuse为例

使用基本光照模型时,Diffuse = DirectDiffuse + IndirectDiffuse, DirectDiffuse = GI.DirectDiffuse, IndirectDiffuse = (GI.IndirectDiffuse + DiffuseAmbientLight) * Diffuse AmbientOcclusion。

使用自定义光照模型时,Diffuse = CustomLighting。

透明部分的输出用于计算透明值。ShaderForge会根据连线情况来配置 Blending 设置中的混合模式(Opaque、AlphaBlend等)。

请输入图片描述
默认没有透明输出时,混合模式为Opaque不透明模式,FinalColor.a = 1。Opacity有输出时,根据混合模式对应的运算得到透明度,FinalColor.a = Opacity。

常用的半透明混合模式有AlphaBlend、Additive,AlphaBlend的计算方式为:SrcAlpha+DstOneMinusSrcASlpha;Additive的计算方式为SrcAlpha+DstOne。

OpacityClip有输出时,会忽略混合模式,默认情况下只渲染高于0.5的颜色值,FinalColor.a = Clip(OpactiyClip -0.5)。

Receive Fog 代表接受雾效影响。 Auto Sort 代表根据混合模式自动选择渲染队列,一般情况下不需要手动修改。 Ignore Projectors 代表忽略投影这类对象的影响。 Write to Depth buffer 代表写深度。

几何绘制部分的输出可以改变绘制物体的顶点计算。
请输入图片描述

2. 节点操作

从节点列表里选择节点拖动到编辑面板中,熟练后可以通过节点名称的首字母以快捷键的方式找到节点。比如使用快捷键“T”找到Texture2D节点,点击添加。
请输入图片描述

3. 其他常用的快捷操作

选中节点:使用Alt+鼠标框选
请输入图片描述

断开连线:使用Alt+右键划动
请输入图片描述

常用节点

官方对节点的说明有详细的描述和图解,建议有疑问的时候去查看官方文档:
http://www.acegikmo.com/shaderforge/nodes/

这里简单说明下颜色的加减乘幂运算。Multiply乘法通常用于使颜色变亮(Color2.0)或变暗(Color0.5),Add加法通常用于使颜色变亮(Color+0.5),Subtract减法通常用于使颜色变暗(Color-0.5),Power幂可以用于对比度调整(Pow(Color,2.2))。

涉及判断(If)的运算通常不推荐在手机游戏中使用,可以通过Min、Max、Step等运算避开。

节点实例

1. 偏色
请输入图片描述

2. UV变化
Pannel、Rotation等节点可用于改变UV,配合Time节点的运算可以产生UV动画。
请输入图片描述

3. 勾边光
Fresnel节点用于获取绘制对象的边缘。
请输入图片描述

4. 地形
Lerp线性插值可以通过一个蒙版贴图来混合两张贴图来得到混合效果。
请输入图片描述


三、代码和优化

从美术的角度来看,不管是否想学习Shader代码,都需要了解它并配合程序员完成最终的优化。优化工作一部分在于节点的使用,另一部分在于代码的删减,这两个方面都可以由程序员来配合完成。从程序的角度来看,也许会认为美术制作Shader是不可掌控的,而实际上,我们应该鼓励美术去学习图形化的Shader编辑工具,并进行指导和优化。

使用ShaderForge制作的Shader可以通过文本的方式打开查看,ShaderForge通过代码开始位置的注释来还原节点连线。

一个普通Shader使用ShaderForge与手写代码的对比如下图所示。
请输入图片描述

Shader设置与代码之间的关联

根据Shader设置会生成对应的代码,对应的关系如下图所示。

1. Shader Settings 和 Properties 模块
请输入图片描述

2. Lighting 模块
请输入图片描述

3. Geometry 和 Blending 模块
请输入图片描述

节点连线与代码之间的关联

节点连线生成的代码大部分在frag这段内容中,可以通过对比的方式来找到节点计算对应的代码,对前文节点示例中的节点图举几个例子:
请输入图片描述
请输入图片描述
请输入图片描述
通常我们会手动修改node_9660这种临时参数为可理解的变量名称。

代码的优化空间

经过了几个版本的更新,ShaderForge生成的代码实际并没有太多的冗余部分。主要表现在三个方面:

1. 多余的编译指令
根据实际使用的光照情况可以选择性地去掉多余的光照编译指令项。
请输入图片描述

2. 多余的采样UV定义
当需要采样多个贴图时,考虑到贴图的UV可以从同一个UV采样进行计算,可以省去多余的UV采样。
请输入图片描述

3. 多余的变量定义
冗余的变量定义可以手动进行合并。
请输入图片描述





原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

相关文章:

  • eclipse不能正常启动
  • ReSharper2017.3的列对齐、排版格式、列对齐错误的修复
  • Vue.js 案例资料汇总
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 软件架构系列二:Clean架构
  • mysql varchar最大长度问题
  • RabbitMQ 高可用集群搭建及电商平台使用经验总结
  • pandas Dataframe['A']与Dataframe[['A']]的区别
  • VS2010 c++生成和调用dll例子(转载)
  • 使用mongoose和bcrypt实现用户密码加密
  • Android WebView基本用法及常见问题
  • 9.Azure文件(文件共享)-NAS(下)
  • 用CORS 解决vue.js django跨域调用
  • 2U 4节点Xeon SP服务器 (上):PowerEdge C6420更受重视
  • Laravel5.5 生成测试数据
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • idea + plantuml 画流程图
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • javascript 哈希表
  • Java超时控制的实现
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 系统认识JavaScript正则表达式
  • 小程序 setData 学问多
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 阿里云ACE认证之理解CDN技术
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #pragma multi_compile #pragma shader_feature
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (ros//EnvironmentVariables)ros环境变量
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)Knockout 创建自定义绑定
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)ObjectiveC 深浅拷贝学习
  • (转)用.Net的File控件上传文件的解决方案
  • **PHP二维数组遍历时同时赋值
  • *上位机的定义
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 简单实现MD5
  • .NET 中的轻量级线程安全
  • .NET连接数据库方式
  • .NET中GET与SET的用法
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Service注解让spring找到你的Service bean
  • @Valid和@NotNull字段校验使用
  • [ NOI 2001 ] 食物链
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • []Telit UC864E 拨号上网
  • [4.9福建四校联考]
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [Android 13]Input系列--获取触摸窗口