开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:553

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 478|回复: 4

[Unity教程] Unity改进彩虹【3】——程序化彩虹方法的优化

[复制链接]  [移动端链接]
排名
7711
昨日变化
5

213

主题

250

帖子

1362

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
3259
威望
0
注册时间
2016-8-1
在线时间
597 小时
最后登录
2017-8-17

蛮牛译员

发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 manew_JR 于 2017-8-11 11:42 编辑

改进彩虹——程序化彩虹方法的优化
在本教程的前一篇文章中,我们已经看到了改进彩虹的方法,我们已经看到了不同的技术,可以在程序上再现彩虹的颜色。有效地解决这个问题将使我们能够以更高的逼真度来模拟基于物理的反射。

这篇文章的目的是介绍一种新的方法,它比以前的任何解决方案都能产生更好的结果,而不需要使用任何分支。
01.png


你可以在这里找到完整的系列:

Part 1. The Nature of Light
Part 2. Improving the Rainbow (Part 1)
Part 3. Improving the Rainbow (Part 2)
Part 4. Understanding Diffraction Grating
Part 5. The Mathematics of Diffraction Grating
Part 6. CD-ROM Shader: Diffraction Grating (Part 1)
Part 7. CD-ROM Shader: Diffraction Grating (Part 2)
Part 8. Iridescence on Mobile
Part 9. The Mathematics of Thin-Film Interference
Part 10. Car Paint Shader: Thin-Film Interference
教程结束会有程序包供下载



介绍
在前一篇文章中,我们分析了四种不同的技术,将电磁波的可见光范围(400 - 700纳米)的波长转换为各自的颜色。

其中三种解决方案(JET,Bruton和Spektre)严重依赖于if语句。虽然这是c#的标准实践,但在着色器中分支是出了名的坏。GPU Gems书中讨论的方法是唯一没有使用任何分支的方法。尽管如此,它并没有提供可见光谱中颜色的最佳近似。

Name
Gradient
GPU Gems
Visible

这篇文章将展示在GPU Gems书中首次描述的优化版本的色彩方案。


“Bump”的颜色方案
在GPU Gems书中引入的原始配色方案使用了三个抛物线(被作者称为“凹凸”)来复制彩虹中R、G和B的分布。

02.png

每个凹凸都由以下方程描述:

1 \\ 1-x^2 & \mathit{otherwise} \end{matrix}\right.\]">


在范围[40,700]中,每个波长w都与范围[0,1]中的标准值x相关联。然后,给出了可见光谱的R、G和B分量:



所有数值都是由作者在实验中选择的。然而,你可以看到它们在颜色的实际分布上有多糟糕。

03.png



优化质量

我个人提出的第一个解决方案,完全使用了GPU Gems颜色方案的相同公式。然而,我已经优化了所有的数值,使颜色的最终范围尽可能地与可见光的颜色相匹配。

结果收敛于以下的解:

04.png

然后得出一个更实际的结果:

Name
Gradient
GPU Gems
Zucconi
Visible


与原始的解决方案一样,这种新方法是无分支的。因此,它适合于着色器。这是代码:

[C#] 纯文本查看 复制代码
// Based on GPU Gems
// Optimised by Alan Zucconi
inline fixed3 bump3y (fixed3 x, fixed3 yoffset)
{
        float3 y = 1 - x * x;
        y = saturate(y-yoffset);
        return y;
}
fixed3 spectral_zucconi (float w)
{
    // w: [400, 700]
        // x: [0,   1]
        fixed x = saturate((w - 400.0)/ 300.0);

        const float3 cs = float3(3.54541723, 2.86670055, 2.29421995);
        const float3 xs = float3(0.69548916, 0.49416934, 0.28269708);
        const float3 ys = float3(0.02320775, 0.15936245, 0.53520021);

        return bump3y (        cs * (x - xs), ys);
}



告诉我更多关于这个解决方案!



改进彩虹

如果我们仔细观察可见光谱中颜色的分布,我们就会发现抛物线不能真正地捕捉到R、G和B的颜色曲线。一个稍微好一点的方法是使用六个抛物线,而不是三个。为每个主组件安装两个bumps,我们可以得到一个更好的近似。这种差异在光谱的紫色部分是可见的。
05.png


这种差异在光谱中的紫色和橙色部分是可见的:
Name
Gradient
Zucconi
Zucconi6
Visible

下面是代码:

[C#] 纯文本查看 复制代码
// Based on GPU Gems
// Optimised by Alan Zucconi
fixed3 spectral_zucconi6 (float w)
{
        // w: [400, 700]
        // x: [0,   1]
        fixed x = saturate((w - 400.0)/ 300.0);

        const float3 c1 = float3(3.54585104, 2.93225262, 2.41593945);
        const float3 x1 = float3(0.69549072, 0.49228336, 0.27699880);
        const float3 y1 = float3(0.02312639, 0.15225084, 0.52607955);

        const float3 c2 = float3(3.90307140, 3.21182957, 3.96587128);
        const float3 x2 = float3(0.11748627, 0.86755042, 0.66077860);
        const float3 y2 = float3(0.84897130, 0.88445281, 0.73949448);

        return
                bump3y(c1 * (x - x1), y1) +
                bump3y(c2 * (x - x2), y2) ;
}



毫无疑问,光谱- zucconi6提供了最好的颜色近似,没有引入任何分支。如果性能是一个问题,您可以依赖它的简化版本的光谱- zucconi。


结语

本文提供了一些最常用的技术,以在着色器中生成类似彩虹的模式。此外,还介绍了一种新颖的方法。
Name
Gradient
JET
Bruton
GPU Gems
Spektre
Zucconi
Zucconi6
Visible

你可以在这个Shadertoy页面上找到这些色彩方案的WebGL版本。


你可以在这里找到完整的系列:
Part 1. The Nature of Light
Part 2. Improving the Rainbow (Part 1)
Part 3. Improving the Rainbow (Part 2)
Part 4. Understanding Diffraction Grating
Part 5. The Mathematics of Diffraction Grating
Part 6. CD-ROM Shader: Diffraction Grating (Part 1)
Part 7. CD-ROM Shader: Diffraction Grating (Part 2)
Part 8. Iridescence on Mobile
Part 9. The Mathematics of Thin-Film Interference
Part 10. Car Paint Shader: Thin-Film Interference
您可以在Patreon上下载cd - rom着色效果的Unity包。
在Patreon上,Python的项目用于发现光谱和zucconi6函数的最优参数。




原文标题:Improving the Rainbow – Part 2








评分

参与人数 1鲜花 +1 收起 理由
youxicehua + 1 赞一个!

查看全部评分

[发帖际遇]: manew_JR 捡了钱没交公 蛮牛币 降了 2 . 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
754/1000
排名
4677
昨日变化
29

12

主题

414

帖子

754

积分

Rank: 5Rank: 5

UID
206456
好友
1
蛮牛币
1159
威望
0
注册时间
2017-2-14
在线时间
154 小时
最后登录
2017-8-17
发表于 6 天前 | 显示全部楼层
{:90:}{:90:}

回复

使用道具 举报

5熟悉之中
872/1000
排名
9626
昨日变化
141

4

主题

690

帖子

872

积分

Rank: 5Rank: 5

UID
209186
好友
0
蛮牛币
1456
威望
0
注册时间
2017-3-1
在线时间
100 小时
最后登录
2017-8-17
发表于 3 天前 | 显示全部楼层
学习了,part3

回复

使用道具 举报

5熟悉之中
793/1000
排名
4713
昨日变化
43

0

主题

420

帖子

793

积分

Rank: 5Rank: 5

UID
156480
好友
0
蛮牛币
1249
威望
0
注册时间
2016-7-12
在线时间
149 小时
最后登录
2017-8-17
发表于 前天 10:17 | 显示全部楼层
666666666666
[发帖际遇]: 东方小巴黎 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1103/1500
排名
2574
昨日变化
5

1

主题

446

帖子

1103

积分

Rank: 6Rank: 6Rank: 6

UID
45741
好友
0
蛮牛币
413
威望
0
注册时间
2014-9-19
在线时间
234 小时
最后登录
2017-8-16
发表于 昨天 09:46 | 显示全部楼层
不错的资源,谢谢楼主的分享。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表