• 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보다 부드럽고 다양한 결과를 산출합니다.

Phong specularity的 Blinn 近似是由 Phong Specular Model的优化做成的。

Blinn(图形研究人员名字), 他决定比起计算每个frame的光反射,做法线Vector和半Vector的内积会更快。

算法上 Blinn比 Phong更柔和,产出的结果更多样化。


Blinn-Phong은 물리적으로 올바른 알고리즘으로 간주되지 않지만 특정 게임의 표현 의도에 사용할 수있는 신뢰할 수있는 반사 하이라이트를 생성합니다.

알고리즘 섹션에 위의 알고리즘을 배치하고 조각 섹션에 아래 코드를 배치하십시오.

Blinn-Phong 虽然不算是正确的物理算法,但是可以生成符合特定游戏表现意图的高光。

算法section放上方算法,碎片section放下方代码。


쉐이더에 Glossiness 값을 지정하면 객체가 일반 분포 (Specularity)를 묘사하는 흰색 강조 표시로 표시되고 나머지 객체는 검정색으로 표시됩니다.

쉐이더를 쉽게 테스트 할 수 있도록 하였는데 위의 구현에서 40은 높은 범위의 함수를 제공 할 수 있도록하기위한 것이지만 모든 사람에게 가장 적합한 값은 아닙니다.

在 Shader 指定 Glossiness 值,个体会显示为表现普通分布 (Specularity)的白色强调,剩余部分表现为黑色。

是方便测试 Shader 的构造,但上面的 40是为了提供高范围函数,但不是说适合所有人。


Phong NDF



Phong 알고리즘은 비 물리적 알고리즘이지만 위의 Blinn 근사보다 훨씬 더 정밀한 결과를 생성합니다.

아래는 구현 예입니다.

Phong 算法是非物理算法,但会生成比上方 Blinn 近似更精确的结果。

下面是实现案例。


Blinn-Phong 방식과 마찬가지로 * 40 은 테스트 용도로만 사용 하십시오.

跟 Blinn-Phong 方式一样, * 40 只能用于测试。


Beckman NDF

Beckman Normal Distribution 기능은 훨씬 고급 기능이며 조도 값을 고려합니다.

여기서 '조도' 란 공학적인 측면에서 '표면 조도(Surface Roughness)'를 뜻한다.

가공된 금속 표면에 생기는 주기가 짧고, 진폭이 비교적 작은 불규칙한 요철(凹凸)의 크기. 촉침식의 측정기로, 측정면에 수직인 단면에 나타나지는 윤곽을 세로방향 및 가로방향으로 확대 기록한 단면 곡선으로부터 표면 거칠기를 구한다.

KS B 0161에서는 표면 거칠기를 다음 세 가지 방법으로 규정하고 있다.

최대 높이 (Rmax)

② 십점 평균 거칠기 (Rz)

③ 중심선 평균 거칠기(Ra)

거칠기뿐만 아니라 우리의 정상 방향과 반 방향 사이의 내적 (dot product)과 함께, 우리는 표면을 가로 지르는 법선의 분포를 정확하게 근사 할 수 있습니다.

Beckman Normal Distribution 功能是更高级的功能,是考虑粗糙度值的。

这里的 '粗糙度' 在工程学上意味着 '表面粗糙度(Surface Roughness)'。

形成在金属表面的周期短,振幅较小的不规则 凹凸的大小。 触针式的测量机,测量面的垂直断面显示的轮廓,从竖向或者横下放大记录的断面曲线得出表面粗糙度。

KS B 0161里表面粗糙度是用以下三个方法规定的。

最高 (Rmax)

② 十漸平均粗糙度 (Rz)

③ 中心线平均粗糙度(Ra)

不仅仅是粗糙度,跟我们的正常方向和反方向间的内积(dot product)一起,我们能近似出穿过表面的法线分布。


이 알고리즘의 구현은 매우 간단합니다.

这个算法的实现非常简单。

주목할 중요한 것은 Beckman 모델이 물체의 표면을 다루는 방법입니다.

위의 그림에서 알 수 있듯이 Beckman 모델은 부드럽게 값을 사용하여 Highlight가 극적으로 강화되는 특정 지점까지 변경되는 속도가 느립니다.

표면의 매끄러움이 증가하는 것처럼, Reflection Highlight를 함께 당겨서 예술적 관점에서 매우 기쁜듯한 부드러운 값을 만들어냅니다.

이 Behavior는 초기 거칠기 값에서 거친 금속에 매우 유리하며 부드러움 값이 증가함에 따라 플라스틱에도 상당히 좋습니다.

需要注意的是 Beckman 模型物件表面的控制方式。

上图就能知道, Beckman 模型使用柔和的值 Highlight 极具强化到某个特定点的速度会变慢。

就跟表面光滑增加一样, Reflection Highlight 一起调,做出美术上比较不错的柔和的值。

这个 Behavior有利于初期粗糙度里的粗糙的金属,增加柔和度后对塑料也很好。



Gaussian NDF

Gaussian Normal Distribution 모델은 다른 모델보다 많이 사용되지는 않습니다.

더 높은 부드러움 값에서 원하는 것보다 훨씬 부드러운 경사면 하이라이트를 생성하는 경향이 있기 때문입니다.

예술적 관점에서 볼 때 이것은 바람직 할 수 있지만 실제 물리적 특성에 대한 논쟁이 있습니다.

Gaussian Normal Distribution 模型跟其他模型比用的频率不多。

因为设到更高的柔和值的时候,会生成比想要的更柔和的倾斜面高光。

在艺术观点看的时候,这是可取的,但是对实际物理特征还需论争。



이 알고리즘의 구현은 표면의 거칠기와 일반 및 하프 벡터의 내적을 사용하는 다른 일반 분포 함수의 구현과 유사합니다.

这个算法的实现跟使用表面粗糙度和普通half vector的内积的其他普通分布函数的实现是类似的。



GGX NDF

GGX는 오늘날 널리 사용되는 것은 아니지만 인기있는 알고리즘 중 하나입니다.

현대 응용 프로그램의 대부분은 BRDF 기능 중 일부에 의존합니다.

GGX는 Bruce Walter와 Kenneth Torrance가 개발했습니다.

이 논문에서 사용 된 많은 알고리즘은 사용되는보다 보편적 인 알고리즘 중 일부입니다.

GGX不是现在普遍适用的,但的确是受欢迎的算法中的一个。

现代应用软件大部分是依赖于 BRDF 部分功能。

GGX是 Bruce Walter和 Kenneth Torrance开发的。

这篇论文里使用的函数都是普遍使用的函数中的一部分。



GGX 알고리즘의 반사 하이라이트는 매우 단단하고 뜨겁지 만 볼 표면 전체에 걸쳐 부드러운 분포를 유지합니다.

이것은 왜 GGX 알고리즘이 금속 표면을 통해 반사의 왜곡을 복제하는 것이 바람직한 지 보여주는 좋은 예입니다.

GGX 算法的反射高光非常坚固,但是通过圆球表面后还是维持柔和的分布。

这是很好的案例,来说明为什么 GGX 算法通过金属表面复制反射的扭曲是好的。


Trowbridge-Reitz NDF

Trowbridge-Reitz 접근법은 GGX와 동일한 논문에서 개발되었으며 GGX 알고리즘과 현저하게 유사한 결과를 산출합니다.

눈에 띄는 차이점은 물체의 극단 가장자리가 GGX보다 더 매끄러운 하이라이트를 특징으로한다는 것입니다.

GGX는 방목 각도에서보다 거친 감쇠를 보입니다.

Trowbridge-Reitz接近法和GGX研发自同一个论文,得出的结果与GGX算法非常相似。

比较显著的差异是物体极端边缘位置高光比GGX更加平滑。

GGX比锐角有着更加粗糙的衰减。


보통 Trowbridge-Reitz 공식은 거칠기와 법선 벡터와 하프 벡터의 내적 (dot product)에 의존합니다.

一般Trowbridge-Reitz公式依存于粗糙度和法线矢量以及半矢量的点积(dot product)。

Ward Anisotropic NDF



Ward 접근 방식으로 비 등방성 BRDF는 Trowbridge-Reitz 방법과 크게 다른 결과를 산출합니다.

Specular 하이라이트는 표면이 부드러워 질수록 훨씬 부드럽고 훨씬 빨리 사라집니다.

Ward接近方式的非各同向性与Trowbridge-Reitz方法非常不同。

Specular 高光在表面越柔和就会更加柔和、消失的也更加迅速。


Trowbridge-Reitz 방법과 마찬가지로 Ward Algorithm은 탄젠트 및 비트 탄젠트 데이터가 필요하지만 일반 및 광의 내적뿐만 아니라 정상 및 우리 관점의 내적을 사용합니다.

和Trowbridge-Reitz方法一样,Ward Algorithm需要tangent和Bit tangent数据,但使用的不光是一般内积和光的内积,还有正常内积及我们观点里的内积。


함께 결합하기 PBR 쉐이더 Pt.2 : 기하학적 쉐도우 잉 함수

기하학적 그림자 알고리즘이란?

一起结合PBR Shader Pt.2:几何学上的阴影函数

何谓几何学的阴影算法?


기하학적 그림자 기능은 마이크로 펫의 자체 음영 현상으로 인한 빛의 감쇠를 설명하는 데 사용됩니다.

이 근사값은 주어진 지점에서 미세면(microfacet)이 서로에 의해 가려 지거나 빛이 여러 개의 마이크로 영역에서 반사 될 확률을 모델링합니다.

이 확률 동안 빛은 시점에 도달하기 전에 에너지를 잃습니다.

GSF를 정확하게 생성하려면 거칠기를 샘플링하여 microfacet 분포를 결정해야합니다.

거칠기를 포함하지 않는 몇 가지 기능이 있으며 신뢰할 수있는 결과를 얻을 수는 있지만 샘플 거칠기 기능만큼 많은 경우에 맞지 않습니다.

Geometric Shadowing Function은 BRDF 에너지 보존에 필수적입니다.

GSF가 없으면 BRDF는받은 빛의 에너지보다 더 많은 빛 에너지를 반사 할 수 있습니다.

microfacet BRDF 방정식의 핵심 부분은 활성 표면적 (L에서 V까지의 빛 에너지를 반사하는 표면 영역에 의해 덮인 면적)과 미세 표면의 총 표면적 사이의 비율과 관련이 있습니다.

Shadowing 및 Masking 이 고려되지 않은 경우 활성 영역이 전체 영역을 초과 할 수 있으며, 이로 인해 BRDF가 에너지를 보존하지 못하고 경우에 따라 과다한 금액이 발생할 수 있습니다.

几何学上的阴影功能用于解释microfacet自身阴影现象导致的光线减弱。

此近似值模拟给定的支点上microfacet互相遮挡或者光线在多个微领域反射的概率。

这个概率中,光线在到达点之前就失去了能量。

想要准确生成GSF,需要对粗糙度进行采样,决定microfacet的分布。

如果有不含粗糙度的几种功能,虽然能获取可靠的结果,但与采样粗糙度功能相比,他们并不适合许多情况。

Geometric Shadowing Function是保留BRDF能量所必需的。

没有GSF的话,BRDF能够反射比接受的光线能量更多的光线能量。

microfacet BRDF方程式的核心部分与活性表面(根据从L到V的光能反射表面区域覆盖的面积)和微表面的总面积之间的比例有关。

不考虑Shadowing和Masking的情况,活性区域可能超出整体区域,也可能导致BRDF无法保存能量,有时会导致性能太耗。


GSF 함수를 미리보기 위해 정규 분포 함수 위에 이 코드를 배치 해 봅시다.

형식은 NDF 기능을 구현 한 방법과 매우 유사하게 작동합니다.

为了预览GSF函数,我们在正规分布函数上添上这个代码。

格式的工作方式与NDF功能的实现方法非常相似。


Implicit GSF (함축적인 GSF)


함축적 GSF는 Geometric Shadowing의 기본 논리입니다.

含蓄的GSF是Geometric Shadowing的基本逻辑。


법선과 빛의 내적을 곱하고 법선과 우리의 시점의 내적을 곱함으로써 우리는 빛이 우리의 견해에 기초한 물체의 표면에 어떻게 영향을 미치는지 정확하게 묘사합니다.

通过将法线与光的内部相乘,然后将法线与视点的内部相乘,我们精确地描述了光是如何影响基于我们观点的物体的表面的。


Ashikhmin-Shirley GSF


이방성 정규 분포 함수와 함께 사용하도록 설계된 Ashikhmin-Shirley GSF는 이방성 효과에 대한 좋은 기반을 제공합니다.

设计成与异方性的正规分布函数一起使用的Ashikhmin-Shirley GSF,可以为异方性效果提供一个好的基础。


오른쪽에서 볼 수 있듯이,이 모델에 의해 생성 된 미세면(microfacet)의 그림자는 매우 미묘합니다.

如同左边看到的,这个Model生成的微表面(microfacet)的影子是非常微妙的。



Ashikhmin-Premoze GSF

Ashikhmin-Premoze GSF는 Ashikhmin-Shirley 방식과 달리 등방성 NDF와 함께 사용하도록 설계되었습니다. Ashikhmin-Shirley와 마찬가지로, 이것은 매우 미묘한 GSF입니다.

Ashikhmin-Premoze GSF与Ashikhmin-Shirley方式不同,设计成要与各同向性的NDF一起使用。和Ashikhmin-Shirley同样的是,这个是一个非常微妙的GSF。



Duer GSF



Duer는 아래에서 다룰 Ward GSF 함수에서 발견 된 specularity와 관련된 문제를 해결하기 위해 아래의 GSF 함수를 제안했습니다. Duer GSF는 위의 Ashikhmin-Shirley와 비슷한 결과를 나타내지 만 등방성 BRDF 또는 매우 약간 이방성 인 BRDF에 더 적합합니다.

Duer提出了以下GFS函数,以解决在下面使用的Ward GSF函数里面发现的specularity和相关问题。Duer GSF虽然是表现与上面Ashikhmin-Shirley类似的结果,但是更适合各同向性的BRDF以及有着非常些微异方性的BRDF。


Neumann GSF

노이만 - 노이만 GSF는 이방성 정규 분포에 적합한 GSF의 또 다른 예입니다. 시야 방향이나 빛의 방향이 커질수록 더 많은 기하학적 음영을 생성합니다.

Neumann - Neumann GSF是适合异方性正规分布的GSF的另一个示例。视野方向或者光线的方向越大,就会生成更多几何阴影。


Kelemen GSF



Kelemen GSF는 적절한 에너지 절약 GSF를 제공합니다. 이전 모델의 대부분과 달리 기하 그림자의 비율은 일정하지 않지만 시야각에 따라 다릅니다. 이것은 Cook-Torrance 기하학적 음영 함수의 극단적 인 근사입니다.

Kelemen GSF可以提供合适的能量节约GSF。和之前的大部分Model不同,虽然几何阴影的比例不是固定的,但他根据视野角度而变化。这是Cook-Torrance几何阴影函数的极端近似。


Modified-Kelemen GSF



이것은 Kelemen Approximation of Cook-Torrance의 변형 된 형태입니다. 거칠게 분산 된 Kelemen GSF를 생산하도록 수정되었습니다.

这是Kelemen Approximation of Cook-Torrance的变形形态。已经被修改为生产粗糙的分散的Kelemen GSF。



Cook-Torrance GSF




Ward GSF



Ward GSF는 강화 된 암시 적 GSF입니다. Ward는이 방법을 사용하여 정규 분포 함수를 강화합니다. 그것은 다양한 각도에서 표면의 이방성 밴드를 강조하는 데 특히 효과적입니다.

Ward GSF是强化的默示性GSF。Ward使用此方法强化正规分布函数。它可以特别有效的从各个角度来强调表面异方性Band。

Smith Based Geometric Shadowing Functions

스미스 기반 GSF는 다른 GSF보다 더 정확하다고 널리 인식되며 정규 분포의 거칠기와 모양을 고려합니다. 이 함수는 GSF를 계산하기 위해 두 조각을 처리해야합니다.

Smith为基础的GSF比其他的GSF更加准确,更加被广泛认可,同时考虑到正规分布的粗糙度和形状。该函数的DSF需要处理两个片段才能进行计算。


Walter et all. GSF


GGX GSF의 일반적인 형태 인 Walter et al. NDF와 함께 사용할 이 함수를 만들었습니다.

Walter et al. GSF는 "방목 각 근처 나 거친 표면을 제외하고는 BSDF (양방향 산란 분포 함수)의 형상에 비교적 작은 영향을 미치지만 에너지 보존을 유지하는 데 필요하다"고 느꼈다. 이를 염두에두고 GSF의 원동력으로 Roughness를 사용하여이 원칙을 존중하는 GSF를 만들었습니다.

Walter et al. NDF是GGX GSF的一般形态,为了能与之共同使用制作了这个函数。

Walter et al. GSF感觉是“虽然对锐角附近或者粗糙表面之外的BSDF(双向散射分布函数)的形成影响很小,但是需要保存能量”。考虑到这一点,我们使用“Roughness”作为GSF的动力,并创建了一个GSF来尊重这一原则。


원래 Beckman NDF와 함께 사용하도록 제작 된 Walter et al. Phong NDF와 함께 사용하기에 적합한 GSF라고 추측했다.

Walter et al.最初是为与Beckman NDF一起使用而制作的,推测是适合与Phong NDF一起使用的GSF。


Schlick은 다른 Smith GSF에도 적용 할 수있는 Smith GSF의 근사치를 몇 개 만들었습니다. 이것은 Smith GSF의 Schlick 근사값입니다.

Schlick做了几个在其他Smith GSF里面也可以使用的Smith GSF的近似值。这是Smith GSF的Schlick近似值。


이것은 Beckman Function의 Schlick 근사입니다. 이것은 조도에 2 / PI의 제곱근을 곱하여 작동합니다. 대신에 우리는 0.797884 ..... 사용.

这是Beckman Function的Schlick近似。在光照度上乘以2 / PI的平方根启动。但是我们使用的是0.797884 .....


Schlick-GGX GSF

GGX의 Schlick Approximation은 우리의 조도 값을 단순히 2로 나눕니다.

GGX的 Schlick Approximation只是把我们的光照度值除以2。


PBR 쉐이더를 함께 사용하기 Pt.3 : 프레넬 기능.

一起使用PBR Shader Pt.3 : Fresnel功能


프레넬 효과는 프랑스의 물리학자인 Augustin-Jean Fresnel의 이름을 따서지었습니다.

이 효과는 표면에서의 반사 강도가 시점에 따라 달라진다는 것을 나타냅니다.

반사 각도는 방목 각도로 볼 때 증가합니다. Fresnel 효과를 우리의 쉐이더에 포함시키기 위해서는 여러 곳에서 사용해야합니다.

먼저 우리는 확산 복고 반사를 고려해야하며 그런 다음 BRDF 프레 넬 효과를 고려해야합니다.

프레 넬을 적절하게 계산하기 위해서는 수직 입사각과 방목각을 고려해야합니다. 아래의 거칠기를 사용하여 프레 넬 기능에 전달할 수있는 확산 프레 넬 반사 발생률을 계산합니다. 이를 계산하기 위해 Schlick 근사값 인 Fresnel을 사용합니다. Fresnel의 Schlick 근사는 다음과 같이 구성됩니다.

Fresnel效果是以法国物理学家Augustin-Jean Fresnel的名字来命名的。

此效果表示表面上的反射强度随时间点的变化而变化。

从锐角角度看,反射角度会增加。为了在我们的Shader中包含Fresnel效果,需要在许多地方使用它。

首先,我们必须考虑扩散复古反射,然后考虑BRDF Fresnel的效果。

要正确计算Fresnel,必须考虑垂直入射角和锐角。使用下面的粗糙度可以计算可传达Fresnel功能的漫反射Fresnel反射率。要计算此问题,请使用Schlick近似值Fresnel。Fresnel的Schlick近似结构如下:

이 함수는 다음과 같이 더 근사 될 수 있습니다.

这个函数可以更近似,如下所示。


이 근사값은 일부 GPU에서 더 빠를 수 있습니다. 위의 x와 1을 전환하여 근사값을 반대로 할 수 있습니다. 여기에서 우리는 Diffuse를 계산하기 위해 아래에서 할 것입니다.

在某些GPU中,此近似值可能更快。可以通过切换上面的x和1来反转近似值。在这里,我们将在下面进行计算Diffuse。


Schlick Fresnel

프레넬 방정식에 대한 Schlick의 근사는 그의 가장 유명한 근사 중 하나 일 수 있습니다. 프레넬 효과의 근사는 방목 각도에서 반사율을 계산할 수있게 해줍니다.

对于Fresnel方程式Schlick的近似,这可能是方程式最有名的一个近似了。Fresnel效果的近似是在锐角上帮助计算反射率。



이 다음 알고리즘은 반사 색상 대신 전달되는 특정 값을 사용합니다. 이 새로운 값은 굴절 지수입니다. IOR은 빛이 표면을 통과하는 속도를 나타내는 데 사용되는 무 차원 숫자입니다. 이 기능을 사용하려면 셰이더에 새 속성 및 변수를 추가해야합니다.

下一个算法使用传递的特定值,而不是反射颜色。此新值是折射率。IOR是一个无维数,用于表示光穿过表面的速度。若要使用此功能,需要向Shader添加新的属性和变量。



Spherical-Gaussian Fresnel

Spherical-Gaussian Fresnel 함수는 Schlick 's Approximation과 매우 유사한 결과를 산출합니다.

유일한 차이점은 Spherical Gaussian 계산에서 파생 된 것입니다.

Spherical-Gaussian Fresnel函数能算出与Schlick 's Approximation非常相似的结果。

唯一的差别就是Spherical Gaussian是计算里面派生的。


함께 PBR Shader를 함께하기 Pt.4 : 함께 가져 오기

알고리즘 결합하기.

一起制作PBR Shader Pt.4:一起导入

结合算法。

이제 NDF, GSF 및 Fresnel Function의 여러 버전이 있으므로이를 결합하여 결과 BRDF PBR Shader를 실제로 볼 수 있습니다. 이러한 알고리즘을 결합하는 형식은 매우 간단합니다. 알고리즘을 서로 곱한 다음 4 * NdotL * NdotV로 나눕니다.

现在NDF,GSF以及Fresnel Function有几个版本,因此把他们结合起来就可以看到BRDF PBR Shader的结果。 这样结合算法的形式非常简单。互相相乘之后用4 * NdotL * NdotV去相除。



알고리즘을 결합한 후에는 확산 된 색상에 그 값을 간단하게 추가 할 수 있습니다.

PBR 실행.

结合了算法之后,扩散的颜色上可以简单添加上值。实行PBR。


Getting Unity Lighting Information Involved


환경을 샘플링하려면 Unity와 쉐이더에서 몇 가지 중요한 단계를 수행해야합니다.

먼저, Reflection Probe 을 장면에 추가하고 구워냅니다. 그런 다음이 함수를 셰이더에 추가해야합니다.

想在环境里取样,需要在Unity和Shader里面执行几个重要的步骤。首先,Reflection Probe要添加在场景里面并进行烘焙。接下来要将下面的函数添加在Shader里面。


프래그먼트 프로그램 내부에서이 함수를 호출하면 환경 샘플링에 사용할 수있는 적절한 데이터가 생성됩니다.

fragment程序内部使用这个函数,可以生成适合环境取样的数据。


이 값들을 사용하기 위해서, 우리는 우리가 이미 우리의 쉐이더에 놓았던 한 줄 또는 두 줄을 대체하여 아래에 보이는 것처럼 최종 결과물에 그것들을 추가하기를 원할 것입니다. 이렇게하면 환경 데이터를 볼 수있는 방식으로 속성을 설정할 때 환경을 샘플링 할 수 있습니다.

이제 Unity의 드롭 다운에서 키워드를 선택하면 활성 알고리즘이 변경됩니다. 이것으로 쉐이더는 잘되어야합니다. 연습용 코드가 지저분한 경우에 대비하여 완전한 쉐이더를 완벽하게 볼 수 있도록 쉐이더 코드를 아래에 준비 했다.

为了使用这些值,我们将我们之前放在shader里面的一行或者两行进行替换,像下面看到的那样在最终结果上添加进去。这样就可以通过看到环境数据的方式,在设置属性的时候进行环境取样。

现在,从Unity下拉列表中选择关键词会更改活性算法。因此shader应该要更好。为了应对练习用代码乱七八糟的情况以及能够完美地看到完整的Shader,我在下面准备了Shader代码。


The Complete Shader



조회 220회

© 2014 by LEEGOONZ HOME.