• JP Lee

综合研究基于物理的渲染算法Unity3D。.( 번역)

2019년 8월 12일 업데이트됨

基于物理的渲染算法

Unity3D에 대한 포괄적인 연구

有关 Unity3D 的概括研究


물리적 기반 렌더링에 대해 이야기해 보겠습니다.

물리적 기반 렌더링(PBR)은 지난 몇 년 동안 매우 인기를 끌고 있습니다.

유니티 5, 언리얼 엔진 4, 프로스트바이트, 심지어 ThreeJS, 그리고 더 많은 게임 엔진이 그것을 사용합니다.

많은 3D 모델링 스튜디오가 Marmoset Toolbag 및 Allegorithmic Substance Suite와 같은 인기있는 도구에 따라 "PBR Pipeline"으로 전환하고 있습니다.

오늘날 파이프 라인에 익숙하지 않은 아티스트를 찾기는 어렵지만 파이프 라인이 백그라운드에서 어떻게 작동하는지 잘 아는 엔지니어와 기술 아티스트를 찾는 것은 어려울 수 있습니다.

이 튜토리얼을 작성하여 PBR 쉐이딩 (shading)을 분해(분석)하여 가능한은 초보자를 PBR로 쉽게 이해할 수있게 만들려고했습니다.

시작합시다.

来说说基于物理的渲染。

基于物理的渲染(PBR)近几年非常火爆。

Unity 5, 虚幻引擎 4, 寒霜引擎, 甚至是 ThreeJS, 更多的游戏引擎在使用它。

很多 3D 模型工作室在根据 Marmoset Toolbag 和 Allegorithmic Substance Suite等人气工具转换成 "PBR Pipeline"。

现在没几个不熟悉管线的美术,但是了解管线在后台是怎么运行的,很少有引擎和美术知道。

我这个指南分解(分析) PBR 渲染 (shading),是想让初学者方便理解 PBR。

让我们开始吧。


PBR의 물리적 특성

지난 3 ~ 40 년 동안 우리 주변 세계에 대한 이해와 그것이 과학적으로 / 수학적으로 어떻게 작용했는지 많은 발전이 있었다.

또한 이러한 이해의 일부는 렌더링 기술 분야에서 엄청난 발전을 가져 왔습니다.

영민한 여러 연구가들은 빛, 시야, 표면의 정상적인 모습, 그리고이 세 가지가 서로 어떻게 상호 작용하는지에 관해 심각한 결론을 내릴 수있었습니다.

이러한 발전은 대부분은 BRDF (양방향 반사율 분포 함수)와 그 고유 한 에너지 보존이라는 아이디어를 중심으로 이루어집니다.

​빛과 관측점이 서페이스와 어떻게 상호 작용하는지 이해하려면 먼저 서페이스 자체를 이해해야합니다.

빛이 완벽하게 매끄러운 표면에 비치면 거의 완벽하게 그 표면에서 반사됩니다.

빛이 우리가 거친 표면이라고 부르는 것과 상호 작용할 때, 그것은 비슷하게 반사되지 않을 것입니다. 이것은 미세표면 (microfacets)의 존재로 설명 할 수 있습니다.

PBR的物理特征

在过去的 3 ~ 40 年,我们对周围世界的理解和科学上 / 数学上它是怎么运作的都有很多进步。

而且这种理解在渲染技术领域也有了很大的发展。

多位灵敏的研究者对光,视野,表面正常形态,然后这三个是怎么互相作用的有着深刻的结论。

这种发展大部分是围绕 BRDF (双向反射率分布函数)和固有能量保存的想法为中心形成的。

​如果想理解光和观测点跟Surface是怎么相互作用的,首先要理解Surface本身。

光照射到完全光滑的表面几乎可以在表面形成完整的反射。

光和我们叫做粗糙表面的东西相互作用的时候,他的反射不是类似的,这可以用微表面 (microfacets)的存在说明。


우리가 물체를 볼 때, 우리는 그것의 표면이 완벽하게 매끄럽지 않고 매우 작은 작은면으로 이루어져야한다고 가정해야합니다. 각각의 물체는 완벽한 Specular reflection 입니다.

이 미세표면(microfacets)은 매끄러운 표면의 법선에 걸쳐 분포되는 법선을가집니다.

마이크로 페이스 노멀이 매끄러운 표면 노멀과 다른 정도는 표면의 거칠기에 의해 결정됩니다.

표면이 거칠수록 반사 하이라이트가 손상 될 가능성이 커집니다.

이 때문에 거친 표면은 더 크고 더 흐리게 보이는 반점을 가지고 있습니다.

매끄러운 표면은 빛이 이전보다 더 완벽하게 반사 될 때 반사 하이라이트를 압축 할 수 있습니다.

我们看物件的时候,要假设他的表面不是完全光滑的,而是用很小的面组成的。每个物件都是完整的 Specular reflection 。

这个微表面(microfacets)通过光滑表面的法线,具有分布的法线。

微表面法线的不同程度是根据表面粗糙度定的。

表面越粗糙,高光损失的可能性就越大。

所以粗糙的表面有更大更模糊的斑点。

光滑的表面上,光的反射比之前更完整时可以压缩反射高光。


이제 BRDF로 돌아가서...

양방향 반사율 분포 함수 (Bridirectional Reflectance Distribution Function, BRDF)는 표면의 반사율을 설명하는 함수입니다.

여러 가지 BRDF 모델 / 알고리즘이 있으며 그 중 다수가 물리적 기반 알고리즘이 아닙니다.

물리적 기반으로 간주되는 BRDF의 경우 에너지 보존이 필요합니다.

'에너지 보존 (Energy Conservation)'은 지표에서 반사 된 총 광량이 지표가받은 총량보다 적다고 말합니다.

再回到 BRDF...

双向反射率分布函数 (Bridirectional Reflectance Distribution Function, BRDF)是说明表面反射率的函数。

有各种 BRDF 模型 / 算法,其中大部分不是基于物理的算法。

基于物理的 BRDF需要能量守恒。

'能量守恒 (Energy Conservation)'是说从地表反射的总光量,比地表收到的总量少。

表面反射的光不能比之前讨论的所有微表面相互作用前更强烈。




표면에서 반사 된 빛은 이전에 논의했던 모든 마이크로면과 상호 작용하기 전보다 더 강렬해서는 안됩니다.

BRDF 알고리즘은 다른 알고리즘보다 더 복잡한 쉐이딩 모델을 특징으로합니다.

이 쉐이딩 모델은 기술적으로 3 개의 단일 부분으로 구성됩니다 : 정규 분포 함수, 기하학적 음영 함수 및 프레 넬 함수.

이 알고리즘을 함께 사용하면 이해 할 수 있을 것입니다.

要理解 BRDF,重点是理解构成 BRDF 的三种功能。

依次实现并做对我们有帮助的阴影模型。BRDF 算法的特点是比其他算法更复杂的Shading模型。

这个Shading模型技术上以三个单一部分组成 : 正规分布函数、几何阴影函数和菲涅尔函数。

一起使用这个算法就能理解了。




PBR 셰이더 작성 : 너트, 볼트 및 매끄러운 표면

PBR 셰이더의 속성

编写 PBR Shader : nut,bolt 和光滑的表面

PBR Shader 属性


대부분의 PBR 쉐이딩 모델에서 어떤 형식으로 몇 가지 동일한 속성이 영향을주는 것은 일반적입니다.

현대 PBR 접근법에서 가장 중요한 두 가지 속성은 부드러움 (Smoothness) 및 금속성 (Metallic)입니다.

이 두 값은 모두 0..1 사이 일 때 가장 잘 작동합니다.

PBR 쉐이더를 작성하는 방법에는 여러 가지가 있으며, 그 중 일부는 디즈니의 PBR 파이프 라인과 같은 더 많은 효과를 위해 BRDF 모델을 사용할 수 있습니다. 각 효과는 특정 속성에 의해 유도됩니다.

Unity에서 Writing Shaders에 대한 내 페이지를 확인하지 않았다면 집중 해서 읽을 수 있는 좋은 시간이 될 것입니다.

大部分 PBR Shading 模型上通常是用某种形态影响几种相同属性。

现代 PBR 思路上最重要的两种属性是光滑 (Smoothness) 和金属性 (Metallic)。

这两个值都是在 0..1 之间的时候最好起效。

编写 PBR Shader 的方法有多个,其中一部分为了更多类似迪士尼 PBR 管线的效果可以使用 BRDF 模型。各个效果由特定属性引出。

如果在 Unity 里没有细读 Writing Shaders相关我的页面,这可以成为你可以集中细读的时间。



Unity Shader에서 public 변수를 정의했습니다.그것들은 나중에 추가하겠습니다.

속성 아래에는 셰이더의 초기화 구조가 있습니다.

나중에 더 많은 기능을 추가 할 때 #pragma 지시문을 나중에 참조 할 것입니다.

在 Unity Shader 里定义 public 变数。那些以后会添加。

属性下方有Shader初始化结构。

以后添加更多功能的时候会参考 #pragma 指令。


Vertex Program

Vertex 프로그램은 Unity에서 셰이더 쓰기에 대한 자습서에서 생성 된 것과 매우 유사합니다.

우리가 필요로하는 핵심 요소는 vertex에 대한 normal, tangent및 bitangent 정보입니다.

따라서 이것들을 Vertex Program에 꼭 포함 시켜야합니다.

Vertex Program

Vertex 程序跟 Unity 里的编写 Shade r相关自学书上生成的类似。

我们需要的核心因素是有关 vertex 的 normal, tangent 和 bitangent 信息。

也就是说这些一定要包含在 Vertex Program里。


Fragment Program

프래그먼트 (fragment) 프로그램에서, 알고리즘에서 나중에 사용할 수있는 변수 세트를 정의 해야 합니다 :

Fragment Program

fragment 程序里,在算法上要定义之后可以使用的变量Set:


유니티 쉐이더 튜토리얼의 설명에 따라 유니티가 제공 한 데이터로 컴파일 할 변수입니다.

이 변수는 BRDF 내부로 이동하면서 셰이더 전체에서 반복적으로 사용됩니다.

根据 Unity Shader 指南的说明,将要用 Unity 提供的数据编译的变量。

这个变量移动到 BRDF 内部,会用在整体 Shader 上。


Roughness

아래의 접근 방식에서는 거칠기를 다시 처리합니다. 이런 처리 방식은 지극히 개인적 선호에 의한 것입니다.

아래에 다시 처리 된 거칠기가 시작적인 체감상 분명한 결과를 만들어내는 것을 발견했습니다.

下面的方法上会重新处理粗糙度。 我做这个的理由是个人喜好。

发现下方重新处理的粗糙度在视觉上的结果更分明。


Metallic

PBR 쉐이더에서 Metallic을 사용할 때 조심 해야 할 것이 많습니다.

알고리즘 중 어느 것도 그 알고리즘을 설명하지 않는다는 것을 알 수 있습니다. 그래서 우리는 다른 형식으로 완전히 포함 시켰습니다.

금속성은 재료가 유전체 재료 (비금속, 즉 금속 = 0) 또는 금속 (금속 = 1) 재료인지 여부를 결정하는 제어 값입니다.

따라서 우리의 메탈릭 값이 쉐이더에 올바른 방식으로 영향을 주도록하기 위해, 우리는 확산 된 색으로 그것을 연결하고 우리의 반사 색을 유도하게 될 것입니다.

금속은 확산 반사(Diffuse)를 보이지 않기 때문에 완전히 반사 된 Albedo를 가지며 실제 반사 색상은 물체의 표면을 반영하여 변경됩니다.

아래 참조 :

PBR shader里使用 Metallic的时候要小心的很多。

可以知道任何算法都不说明那个算法。所以我们用其他形式完全包含了。

金属材料是电介质 (非金属,也就是金属 = 0) 或者是决定是不是金属 (금속 = 1) 材料的控制值。

也就是说,为了我们的金属度值用正确的方式影响到Shader,我们要用扩散的颜色连接这些,诱导出我们的反射颜色。

金属不会显示扩散反射(Diffuse),所以有完全反射的 Albedo,实际的反射颜色会反映物体的表面去变更。

参考以下 :


Unity에서 머티리얼에 첨부 할 때 세이더 코드를 사용 해 흰색 객체를 만들어야합니다.

속성 션, 변수 섹션의 변수, Helper 함수 섹션의 Helper 함수, 알고리즘 섹션의 알고리즘 및 Fragments 섹션의 셰이더 코드 구현을 통해이 셰이더를 확장합니다.

添加到Unity里在材质时要使用Shader代码制作白色个体。

通过属性Shun, 变量section的变量, Helper 函数section的 Helper 函数,算法section的算法和 Fragments section的Shader代码实现扩张shader。


PBR 쉐이더 구성하기 Pt.1 : 정규 분포 함수 (Specular Function)

정규 분포 함수 란?

构成 PBR SHADER Pt.1 :法线分布函数 (Specular Function)

法线分布函数是什么?


Normal Distribution Function은 BRDF 쉐이더를 구성하는 세 가지 핵심 요소 중 하나입니다.

NDF는 표면 상에 미세면 정상 분포를 통계적으로 설명합니다.

용도에 따라 NDF는 반사 (명암)의 밝기를 조정하는 가중 함수 역할을합니다.

NDF는 지표의 기하학적 특성으로 생각하는 것이 중요합니다.

셰이더에 알고리즘을 추가하기 시작하여 NDF가 생성하는 효과를 시각화 할 수 있습니다.

우리가 하고 싶은 첫 번째 일은 알고리즘을 만드는 것입니다.

알고리즘을 시각화하기 위해 Float 타입의 임의 값을 오버라이드 하여 반환 해 줍니다.

Normal Distribution Function是构成 BRDF shader的三个核心因素中的一种。

NDF统计说明表面的微面正常分布。

根据用途 NDF的作用是调整反射 (明暗)亮度的权重函数。

重点是要以几何学特征想NDF。

可以开始在Shader添加算法,视觉化 NDF 生成的效果。

我们想做的第一件事情是制作算法。

为了视觉化算法,override 并返还 Float 类型的任意值。


다음 섹션의 형식은 다음과 같습니다.

알고리즘 섹션에 알고리즘을 작성한 후에는 위에서 설명한 위치에 알고리즘을 구현합니다.

새 알고리즘을 구현할 때 위의 활성 알고리즘을 주석 처리하면 결과로 나오는 효과는 현재 주석 처리되지 않은 알고리즘에만 기반을 둡니다.

걱정하지 마시고, 우리는 이것을 나중에 정리하고 Unity 내에서 알고리즘 사이를 쉽게 전환 할 수있는 방법을 제공해 줄 것이며 더 이상의 주석 재생은 필요하지 않습니다.

간단한 Blinn-Phong 방식으로 시작하겠습니다.

下面的 section 形式如下。

在算法section里写算法后,在上面说明过的位置实现算法。

实现新算法的时候,把上面激活的算法注释处理的话,出来的结果效果就只是基于现在没有注释处理的算法 。

不要担心,我们之后在整理这个 Unity 内部会提供便于算法间转换的方法,不需要再现注释了。

用简单的 Blinn-Phong 方式开始吧。


Blinn-Phong NDF


Phong specularity의 Blinn 근사는 Phong Specular Model의 최적화로 만들어졌습니다.

Blinn(그래픽스 연구가 이름), 그는 매 프레임마다 빛의 반사 벡터를 계산하는 것보다 법선 벡터와 반 벡터의 내적을 만드는 것이 더 빠르다고 결정했습니다.

알고리즘은 Blinn이 Phong보다 부드럽고 다양한 결과를 산출합니다.