[Unity][翻译]云朵Shader步骤分解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Unity][翻译]云朵Shader步骤分解相关的知识,希望对你有一定的参考价值。

参考技术A

人工翻译自Alexandre Stroukoff的文章《CLOUDS SHADER BREAKDOWN》,原文链接: http://astroukoff.blogspot.com/2019/09/clouds-shader-breakdown.html

在正文之前,先说下作者的制作过程,大致分为三步:

从作者的介绍来看,第一步目的是创建云朵模型,第二步目的是烘焙光照,理论上也可以用别的软件来做,并且提前烘焙光照意味着云朵在引擎中是静态不受光照的,这点需要注意,文章末尾也有关于动态光照的说明。

前两步作者只是简单介绍了一下,并且视频很糊,就不贴了,以下是正片,文章中的引用段是我的注释。

我根据ThatGameCompany的游戏《Sky 光遇》制作了一个云朵Shader,本篇文章是关于它的一个小小的步骤分解。

效果中作用最大的是云朵Mesh本身,其次是烘焙光照,我使用Houdini + 3ds Max来生成它们。在这篇文章中我仅注重于介绍Shader部分,Shader使用Amplify Shader Editor(ASE)制作。

第一步连接Vertex Color(顶点色)到Emission(自发光),为了显示先前(在3ds Max中)烘焙的光照,我使用了一个0.454545的指数来校正顶点色(因为sRGB/Linear/Gamma叭啦叭啦)。

大量的三角面能带来更丝滑的移位效果,如果性能上吃得消, Tesselation (曲面细分)是个好办法,在左侧面板勾上“tesselation”选项,选择distance based模式。

调整距离与tesselation参数直到你和你的电脑都满意为止,这里调一个非常近的距离就不错。

现在好玩的来了,我加了一个 Noise Generator(噪声生成器) ,这个节点很方便,它可以根据世界位置生成3D噪声。使用3D噪声比较吃性能,你可以换成Simplex(单形噪声),我很确定整个效果都可以用噪声纹理和UV搞定。我用世界坐标乘以一个浮点数,用作噪声节点的“Size”输入,这个浮点数用来控制噪声的tiling。
并且 从-1/1 映射到 0/1 ,避免出现负值。
在Debug输入中加入了这个(指上面的浮点数)。

现在,不直接使用World Position,而是 将它乘以一个Vector3("NoiseScaleA") ,这样可以 对噪声做非统一缩放 ,非常方便!(就像对Mesh进行缩放一样,但你只是缩放输入位置)。这里我沿Z轴对噪声进行拉伸示范一下效果。

是时候加点移动了,很直接,在我将缩放后的世界坐标连接到噪声之前,我 增加一个Vector3,令时间与它相乘 ,这样就可以控制 噪声移动的方向

现在将它连到 Local Vertex Offset ,并与两个东西相乘:

我决定 把噪声重复3次 。复制所有参数,并且把它们加在一起。这让我想起了以前做过的一个项目(卡通火山碎屑噪声)。思路很简单:对于每个噪声,将力度降低一半,双倍tiling,双倍速度,然后再调整!

每个噪声之间的关系 很重要,这里我只调整Strength(力度),单独调整噪声很容易(将除当前噪声外的所有力度调为0),然后调整力度。

对于渐变的边缘,使用透明材质和 Depth Fade节点 简单设置。

这一部分比较取巧(hack),但它增添了许多细节。大体上来说我就是添加了一个黑白的云朵纹理,并使用Triplanar Mapping(三面映射)采样,为了让Triplanar Mapping动起来,我使用了来自噪声C的修改后的世界位置(看下面的图1),并且我让所有东西与噪声A相乘来“抹去”这里那里的纹理(看下面的图2)。

我使用了Register/Get Local Var节点,避免我的连线乱得像兜里打结的耳机线,ASE的这个功能真是太棒了。

你可以看到加入云朵纹理后的效果,真系好靓!

仓库地址: https://github.com/AlexStrook/UnlitClouds

备注:

Unity3D Shader官方教程翻译----Shader语法:Pass的Blending(混合)

ShaderLab syntax: Blending 混合


Blending is used to make transparent objects.

混合是用来制作透明物体的。

技术分享
When graphics are rendered, after all shaders have executed and all textures have been applied, the pixels are written to the screen. How they are combined with what is already there is controlled by the Blend command.

在所有着色器执行完毕,所有纹理都被应用,所有像素准备被呈现到屏幕之后, 使用Blend命令来操作这些像素进行混合。

指导:

Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。

参考文章:http://hi.baidu.com/ÖÙÁÁÁÁ/blog/item/5fc565445e19714a500ffebb.html
Syntax 语法
Blend Off
Turn off blending
关闭混合

Blend SrcFactor DstFactor 混合 起始因子
Configure & enable blending. The generated color is multiplied by the SrcFactor. The color already on screen is multiplied by DstFactor and the two are added together.
配置并开启混合。计算产生的颜色和srcFactore相乘。已经在屏幕上的颜色和dstFactor相乘,然后2个颜色相加。

Blend SrcFactor DstFactor, SrcFactorA DstFactorA
Same as above, but use different factors for blending the alpha channel.
和上面相同,但是有些因子不同。SrcFactorA DstFactorA 这些因子使用alpha通道进行混合。

BlendOp Min | Max | Sub | RevSub
Instead of adding blended colors together, do a different operation on them.
不是将加入的颜色混合在一起,而是对他们做不同的操作。

Properties 属性

All following properties are valid for both SrcFactor & DstFactor. Source refers to the calculated color, Destination is the color already on the screen.

下面列出的所有属性是对SrcFactor & DstFactor有效。Source 是指计算出的颜色,Destination 指的是已经的屏幕上的颜色。One
The value of one - use this to let either the source or the destination color come through fully.
值为1,使用此设置来让源或是目标颜色完全的通过。


Zero
The value zero - use this to remove either the source or the destination values.
值为0,使用此设置来删除源或目标值。


SrcColor
The value of this stage is multiplied by the source color value.
此阶段的值是和源颜色的值相乘。


SrcAlpha
The value of this stage is multiplied by the source alpha value.
此阶段的值是和源alpha值相乘。


DstColor
The value of this stage is multiplied by frame buffer source color value.
此阶段的值是和源帧缓冲中源颜色的值相乘。


DstAlpha
The value of this stage is multiplied by frame buffer source alpha value.
此阶段的值是和源帧缓冲中源Alpha的值相乘。


OneMinusSrcColor
The value of this stage is multiplied by (1 - source color).
此阶段的值是和(1-源颜色)的值相乘。


OneMinusSrcAlpha
The value of this stage is multiplied by (1 - source alpha).
此阶段的值是和(1-源Alpha)的值相乘。


OneMinusDstColor
The value of this stage is multiplied by (1 - destination color).
此阶段的值是和(1-目标颜色)的值相乘。


OneMinusDstAlpha
The value of this stage is multiplied by (1 - destination alpha).
此阶段的值是和(1-目标Alpha)的值相乘。



Details 详情

Below are the most common blend types:

下列是最经常使用的混合类型
Blend SrcAlpha OneMinusSrcAlpha // Alpha blending alpha混合
Blend One One // Additive 相加混合
Blend One OneMinusDstColor // Soft Additive 柔和相加混合
Blend DstColor Zero // Multiplicative 相乘混合
Blend DstColor SrcColor // 2x Multiplicative 2倍相乘混合
Example 例子

Here is a small example shader that adds a texture to whatever is on the screen already:

这里是1个着色器的小例子:将一个纹理添加到屏幕上,无论它是否已经在屏幕上。
Shader "Simple Additive" {
Properties {
_MainTex ("Texture to blend", 2D) = "black" {}
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Blend One One
SetTexture [_MainTex] { combine texture }
}
}
}

And a more complex one, Glass. This is a two-pass shader:

1个更复杂的着色器:玻璃。它含有2个pass
The first pass renders a lit, alpha-blended texture on to the screen. The alpha channel decides the transparency.
第一个pass渲染光照和将纹理以alpha混合的方式渲染到屏幕上。Alpha通道决定其透明度。

The second pass renders a reflection cubemap on top of the alpha-blended window, using additive transparency.

第二个pass渲染一个反射立方体贴图在alpha混合得视窗的顶部,使用附加的透明度。
Shader "Glass" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Transparency (A)", 2D) = "white" {}
_Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Blend SrcAlpha OneMinusSrcAlpha
Material {
Diffuse [_Color]
}
Lighting On
SetTexture [_MainTex] {
combine texture * primary double, texture * primary
}
}
Pass {
Blend One One
Material {
Diffuse [_Color]
}
Lighting On
SetTexture [_Reflections] {
combine texture
Matrix [_Reflection]
}
}
}
}

由www.J2meGame.com原创,转载请说明

以上是关于[Unity][翻译]云朵Shader步骤分解的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D Shader官方教程翻译----Shader语法:Pass的Blending(混合)

翻译5 Unity Advanced Lighting

unity用脚本怎么让shader重绘

Unity Shader:几何着色器

UnityShaderToys——将大神们写的shader搬到unity中来吧

UnityShaderToys——将大神们写的shader搬到unity中来吧