Volumetric Lighting


介绍一下Fusion的体积光视频里讲的不是很清楚,可以自己看一下体积光光的定义,其实可以理解为丁达尔效应就是能看到的光线,一般出现在大气中有雾气或灰尘。太阳刚好投射在上面,被分割成一条条,有时成一大片。

丁达尔效应

Fusion 渲染器


Fusin的渲染器是非常非常古老OpenGL渲染器。

  • 高情商的说:就是兼容性优秀且快速的渲染器。
  • 低情商的说:就是依托答辩,没有光线追踪,没有SSS材质不支持PBR,甚至连反射都没有,严重脱节现代的所有渲染器与3D软件

在Fusion内甚至不能够直接渲染体积光,只能用后期的方式实现。
就在前段时间Fuison 18.5加入了新的USD工具,加入了新的Storm渲染器好消息是渲染速度非常快,坏消息是完全满足不了工作需求,KD插件还G了
也不清楚BMD未来要怎样发展Fusin。

实现体积光


前面说了体积光类似丁达尔效应,其实在Fusion里也类似,Fusion有一种叫做体积雾(Volume Fog)的后期效果(并不能读取VDB文件)这个效果还能接收3D场景里的灯光信息,只需要让灯光照在体积雾上就能实现体积光的效果。

  • 先建一个简单的3D场景

新建场景

  • 用一个很大的模型把场景和相机都包住,这样渲染出来的World Position通道会更准确。将模型的材质透明度改为0,并且取消掉抑制透明像素的辅助通道的勾选,可以让模型不可见但能渲染辅助通道。

WPP优化

  • 渲染的时候勾上World Position通道,然后使用Volume Fog节点,连接后调整体积雾的大小覆盖整个场景。建场景的时候已经放置了灯光,在Volume Fog中勾选使用照明就能看到体积光。

Volume Fog:输入图像需要带有World Position通道,并且要有一个和通道匹配的相机连接,连接场景时会自带选择相机。

体积雾

  • 详细参数可以自己看工程,如果需要有纹理的灯光可以使用Projector3D节点。
    • 做体积光时可以提高体积雾采样率,我一般用128左右。
    • 不想看到黑色的雾可以将颜色里的Alpha调为0
    • 灯光推荐使用线性或者二次方的模式这两种模式的衰减更接近现时,但大场景衰减过于严重。
    • 更多的体积雾设置可以在照明一组里找到。
    • 制作时请务必要体积雾铺满你的场景。
    • 如果你只是想做丁达尔效应或者上帝之光的效果可以使用DirectionalBlur或者Rays节点。

工程


复制后到达芬奇Fuiosn页面或者独立版里黏贴。

带贴图的体积雾

{
	Tools = ordered() {
		VolumeFog1 = VolumeFog {
			CtrlWZoom = false,
			Inputs = {
				["Rotate.RotOrder"] = Input { Value = FuID { "XYZ" }, },
				ScaleNest = Input { Value = 1, },
				["Scale.X"] = Input { Value = 5, },
				["Scale.Y"] = Input { Value = 5, },
				Size = Input { Value = 8.03, },
				Dither = Input { Value = 0, },
				Samples = Input { Value = 256, },
				["Noise.Rotate.RotOrder"] = Input { Value = FuID { "XYZ" }, },
				["Noise.Scale.Lock"] = Input { Value = 1, },
				Camera = Input { Value = FuID { "Camera3D1" }, },
				DoLighting = Input { Value = 1, },
				Reflection = Input { Value = 10, },
				Image = Input {
					SourceOp = "Renderer3D1",
					Source = "Output",
				},
				SceneInput = Input {
					SourceOp = "Merge3D1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 935, -82.5 } },
		},
		FastNoise1 = FastNoise {
			Inputs = {
				EffectMask = Input {
					SourceOp = "Ellipse1",
					Source = "Mask",
				},
				GlobalOut = Input { Value = 250, },
				Width = Input { Value = 1000, },
				Height = Input { Value = 1000, },
				["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
				Detail = Input { Value = 10, },
				Contrast = Input { Value = 2.59, },
				Brightness = Input { Value = -0.37, },
				XScale = Input { Value = 11.65, },
				SeetheRate = Input { Value = 0.1, },
			},
			ViewInfo = OperatorInfo { Pos = { 715, -148.5 } },
		},
		Shape3D3_2 = Shape3D {
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				["SurfaceCubeInputs.Height"] = Input { Value = 6, },
				["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 5, },
				["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 2, },
				["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 6, },
				SceneInput = Input {
					SourceOp = "Projector3D1",
					Source = "Output",
				},
				["Transform3DOp.Translate.Y"] = Input { Value = 3.28933866575572, },
				["Transform3DOp.Rotate.Y"] = Input {
					Value = 68.5,
					Expression = "time",
				},
				Shape = Input { Value = FuID { "SurfaceConeInputs" }, },
				["MtlStdInputs.Diffuse.Color.Green"] = Input { Value = 0, },
				["MtlStdInputs.Diffuse.Color.Blue"] = Input { Value = 0, },
				["MtlStdInputs.ReceivesLighting"] = Input { Value = 0, },
				["MtlStdInputs.ReceivesShadows"] = Input { Value = 0, },
				["MtlStdInputs.MaterialID"] = Input { Value = 10, },
				["SurfaceConeInputs.Radius"] = Input { Value = 0.47, },
				["SurfaceConeInputs.Height"] = Input { Value = 0.6, },
				["SurfaceConeInputs.Wireframe"] = Input { Value = 1, },
				["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 7, }
			},
			ViewInfo = OperatorInfo { Pos = { 715, -82.5 } },
		},
		Projector3D1 = LightProjector {
			Inputs = {
				["Transform3DOp.Translate.Y"] = Input { Value = 0.3, },
				["Transform3DOp.Rotate.Y"] = Input { Value = -250, },
				DecayType = Input { Value = 1, },
				Angle = Input { Value = 29.7, },
				ProjectiveImage = Input {
					SourceOp = "FastNoise1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 715, -115.5 } },
		},
		Renderer3D1 = Renderer3D {
			CustomData = {
				ToolVersion = 2,
			},
			Inputs = {
				GlobalOut = Input { Value = 250, },
				Width = Input { Value = 1920, },
				Height = Input { Value = 1080, },
				["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
				SceneInput = Input {
					SourceOp = "Merge3D1",
					Source = "Output",
				},
				RendererType = Input { Value = FuID { "RendererOpenGL" }, },
				["RendererOpenGL.Channels.Nest"] = Input { Value = 1, },
				["RendererOpenGL.Channels.WorldCoord"] = Input { Value = 1, },
				["RendererOpenGL.AntiAliasing.Nest"] = Input { Value = 1, },
				["RendererOpenGL.AntiAliasing.Channels.RGBA.HighQuality.Enable"] = Input { Value = 1, },
				["RendererOpenGL.AntiAliasing.Presets.Nest"] = Input { Value = 1, },
				["RendererOpenGL.AntiAliasing.Presets.Color.Supersampling.HighQuality.RateX"] = Input { Value = 1, },
				["RendererOpenGL.AntiAliasing.Presets.Color.Supersampling.HighQuality.RateY"] = Input { Value = 3, },
				["RendererOpenGL.AntiAliasing.Presets.Color.Multisampling.LowQuality.SampleCount"] = Input { Value = 2, },
				["RendererOpenGL.AntiAliasing.Presets.Color.Multisampling.HighQuality.SampleCount"] = Input { Value = 3, },
				["RendererOpenGL.AntiAliasing.Presets.Aux.Supersampling.HighQuality.RateX"] = Input { Value = 3, },
				["RendererOpenGL.AntiAliasing.Presets.Aux.Supersampling.HighQuality.RateY"] = Input { Value = 3, },
				["RendererOpenGL.AntiAliasing.Presets.Aux.Multisampling.LowQuality.SampleCount"] = Input { Value = 2, },
				["RendererOpenGL.AntiAliasing.Presets.Aux.Multisampling.HighQuality.SampleCount"] = Input { Value = 3, },
				["RendererOpenGL.AccumQuality"] = Input { Value = 32, },
				["RendererOpenGL.LightingEnabled"] = Input { Value = 1, },
				["RendererOpenGL.Texturing"] = Input { Value = 1, },
				["RendererOpenGL.TextureDepth"] = Input { Value = 0, },
			},
			ViewInfo = OperatorInfo { Pos = { 935, 16.5 } },
			SubInputsData = {
				RendererOpenGL = {
					Version = 1
				}
			}
		},
		Merge3D1 = Merge3D {
			Inputs = {
				SceneInput1 = Input {
					SourceOp = "Shape3D3",
					Source = "Output",
				},
				SceneInput2 = Input {
					SourceOp = "Transform3D1",
					Source = "Output",
				},
				SceneInput4 = Input {
					SourceOp = "Shape3D3_1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 715, 16.5 } },
		},
		Shape3D3_1 = Shape3D {
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 3, },
				["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 4, },
				SceneInput = Input {
					SourceOp = "Shape3D3_2",
					Source = "Output",
				},
				["Transform3DOp.Translate.Y"] = Input { Value = -2.811, },
				["Transform3DOp.Rotate.Y"] = Input {
					Value = 68.5,
					Expression = "time",
				},
				Shape = Input { Value = FuID { "SurfaceCubeInputs" }, },
				["MtlStdInputs.ReceivesLighting"] = Input { Value = 0, },
				["MtlStdInputs.ReceivesShadows"] = Input { Value = 0, },
				["MtlStdInputs.MaterialID"] = Input { Value = 10, },
				["SurfaceCubeInputs.SizeLock"] = Input { Value = 0, },
				["SurfaceCubeInputs.Height"] = Input { Value = 6, },
				["SurfaceCubeInputs.SubdivisionWidth"] = Input { Value = 1, },
				["SurfaceCubeInputs.SubdivisionDepth"] = Input { Value = 1, },
				["SurfaceCubeInputs.Wireframe"] = Input { Value = 1, },
				["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 2, }
			},
			ViewInfo = OperatorInfo { Pos = { 715, -49.5 } },
		},
		Ellipse1 = EllipseMask {
			Inputs = {
				Filter = Input { Value = FuID { "Fast Gaussian" }, },
				SoftEdge = Input { Value = 0.06, },
				MaskWidth = Input { Value = 1920, },
				MaskHeight = Input { Value = 1080, },
				PixelAspect = Input { Value = { 1, 1 }, },
				ClippingMode = Input { Value = FuID { "None" }, },
				Width = Input { Value = 0.925303860540315, },
				Height = Input { Value = 0.925303860540315, },
			},
			ViewInfo = OperatorInfo { Pos = { 605, -148.5 } },
		},
		SpotLight1 = LightSpot {
			Inputs = {
				["Transform3DOp.Translate.Y"] = Input { Value = 0.3, },
				["Transform3DOp.Rotate.Y"] = Input { Value = -250, },
				DecayType = Input { Value = 1, },
				ConeAngle = Input { Value = 24.09, },
				PenumbraAngle = Input { Value = 8.03, },
				Dropoff = Input { Value = 2.94, },
			},
			ViewInfo = OperatorInfo { Pos = { 605, -115.5 } },
		},
		Transform3D1 = Transform3D {
			Inputs = {
				SceneInput = Input {
					SourceOp = "Camera3D1",
					Source = "Output",
				},
				["Transform3DOp.Translate.X"] = Input {
					SourceOp = "Transform3D1X轴偏移",
					Source = "Value",
				},
				["Transform3DOp.Translate.Y"] = Input { Value = 0.0330901880861674, },
				["Transform3DOp.Translate.Z"] = Input { Value = -0.104703038902101, },
			},
			ViewInfo = OperatorInfo { Pos = { 715, 82.5 } },
		},
		["Transform3D1X轴偏移"] = BezierSpline {
			SplineColor = { Red = 251, Green = 0, Blue = 0 },
			CtrlWZoom = false,
			KeyFrames = {
				[0] = { 0, RH = { 30, 0.40283416814058 }, Flags = { Linear = true } },
				[90] = { 1.20850250442174, LH = { 60, 0.805668336281161 }, RH = { 143.333333333333, 1.80100166961449 }, Flags = { Linear = true } },
				[250] = { 2.986, LH = { 196.666666666667, 2.39350083480725 }, Flags = { Linear = true } }
			}
		},
		Shape3D3 = Shape3D {
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				Shape = Input { Value = FuID { "SurfaceCubeInputs" }, },
				["MtlStdInputs.Diffuse.Opacity"] = Input { Value = 0, },
				["MtlStdInputs.MaterialID"] = Input { Value = 10, },
				["SurfaceCubeInputs.Width"] = Input { Value = 150, },
				["SurfaceCubeInputs.Visibility.Nest"] = Input { Value = 1, },
				["SurfaceCubeInputs.Visibility.IgnoreTransparentPixelsInAuxChannels"] = Input { Value = 0, },
				["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 2, },
				["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 3, }
			},
			ViewInfo = OperatorInfo { Pos = { 550, 16.5 } },
		},
		Camera3D1 = Camera3D {
			Inputs = {
				["Transform3DOp.Translate.X"] = Input { Value = -0.224205562895926, },
				["Transform3DOp.Translate.Z"] = Input { Value = 24.7021443373949, },
				AoV = Input { Value = 19.2642683071402, },
				["Stereo.Mode"] = Input { Value = FuID { "OffAxis" }, },
				FilmGate = Input { Value = FuID { "BMD_URSA_4K_16x9" }, },
				ApertureW = Input { Value = 0.831496062992126, },
				ApertureH = Input { Value = 0.467716535433071, },
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				["MtlStdInputs.MaterialID"] = Input { Value = 1, },
			},
			ViewInfo = OperatorInfo { Pos = { 715, 115.5 } },
		}
	}
}