• 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

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

아래에 다시 처리 된 거칠기가