查看: 3635|回复: 7
打印 上一主题 下一主题

[经验分享] 汽车喷漆效果的实现

[复制链接]

1557

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
454
精华
31

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2013-10-15 16:12:52 |只看该作者 |倒序浏览

给汽车身体喷漆是一个复杂的过程,车身油漆是昂贵分层形式,往往包含染料层,搪瓷金属箔悬浮层.
由于这些接二连三油漆表面层,展示出了一种复杂的光学交互,使车看起来平滑,光泽。

完整的HLSL像素着色器代码如下:

struct psInput
{
      float2 Tex : TEXCOORD0;
      float3 Tangent : TEXCOORD1;
      float3 Binormal : TEXCOORD2;
      float3 Normal : TEXCOORD3;
      float3 View : TEXCOORD4;
      float3 SparkleTex : TEXCOORD5;
};

float4 main(PsInput i) : COLOR
{
      // 取得当前的法线图
      float3 vNormal = tex2D( normalMap, i.Tex );
      // 缩放和偏移让其在[-1.0, 1.0]区域内:
      vNormal = 2.0f * vNormal - 1.0f;

      // 获得高频率扰动的法线,通过查询一个噪声图。
      float3 vFlakesNormal = tex2D(microflakeNMap, i.SparkleTex);
      // 别忘了转换到 [-1.0, 1.0] 区域内:
      vFlakesNormal = 2 * vFlakesNormal - 1.0;

      // 计算以下公式
      // Np1 = ( a * Np + b * N ) / || a * Np + b * N || where a << b
      //
      float3 vNp1 = microflakePerturbationA * vFlakesNormal + normalPerturbation * vNormal ;

      // 计算以下公式
      // Np2 = ( c * Np + d * N ) / || c * Np + d * N || where c == d
      float3 vNp2 = microflakePerturbation * ( vFlakesNormal + vNormal ) ;

      // 因为需要与法线点乘求夹角,所以我们必须将它归一化一下
      float3 vView = normalize( View );

      // 把表面法线转换好世界空间中来,计算bump map的方法。
      float3x3 mTangentToWorld = transpose( float3x3( Tangent, Binormal, Normal ) );
      float3 vNormalWorld = normalize( mul( mTangentToWorld, vNormal ));

      // 计算夹角余玄
      float fNdotV = saturate(dot( vNormalWorld, vView));

      // 计算出反射向量
      float3 vReflection = 2 * vNormalWorld * fNdotV - vView;

      // 我们需要一个gloss值来读环境图,在真实的demo中,反射效果会有轻微的模糊。
      float fEnvBias = glossLevel;

      // 用反射向量采样环境图。
      float4 envMap = texCUBEbias( showroomMap, float4( vReflection, fEnvBias ) );

      //乘以亮度值,在a通道中储存 RGBE
      envMap.rgb = envMap.rgb * envMap.a;

      // 再乘以一个亮度系数
      envMap.rgb *= brightnessFactor;

      // 将切线空间中的法线变换到世界坐标中来.
      float3 vNp1World = normalize( mul( mTangentToWorld, vNp1) );

      // 法线和视线点乘,得到斐涅尔系数
      float fFresnel1 = saturate( dot( vNp1World, vView ));

      // 将第二个法线也同样重切线空间中变换到世界坐标中来.
      float3 vNp2World = normalize( mul( mTangentToWorld, vNp2 ));

      // 同样的方法得到第二个斐涅尔系数.
      float fFresnel2 = saturate( dot( vNp2World, vView ));

      // 开始合成所有层了.
      // 根据公式三
      float fFresnel1Sq = fFresnel1 * fFresnel1;
      float4 paintColor = fFresnel1 * paintColor0 +
      fFresnel1Sq * paintColorMid +
      fFresnel1Sq * fFresnel1Sq * paintColor2 +
      pow( fFresnel2, 16 ) * flakeLayerColor;

      // 最后与反射的环境贴图合成在一起,形成最终的结果.
      float fEnvContribution = 1.0 - 0.5 * fNdotV;
      float4 finalColor;
      finalColor.a = 1.0;
      finalColor.rgb = envMap * fEnvContribution + paintColor;
      return finalColor;
}
结论
此代码所使用的算法,经验更大于真实的物理属性,所以需要不断得调整常数值,
来使最终得到一个满意的效果.

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-10-15 16:44:06 |只看该作者
Thanks for sharing !
回复

使用道具 举报

0

主题

3

听众

2200

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2013-10-16 22:18:30 |只看该作者
谢谢楼主,学习了
回复

使用道具 举报

2

主题

1

听众

1143

积分

助理设计师

Rank: 4

纳金币
350
精华
0
地板
发表于 2013-10-28 10:42:41 |只看该作者
感谢楼主分享
回复

使用道具 举报

1

主题

1

听众

4795

积分

中级设计师

Rank: 5Rank: 5

纳金币
955
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-2-24 02:08:49 |只看该作者
谢谢分享
回复

使用道具 举报

0

主题

1

听众

2286

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2014-2-24 09:43:39 |只看该作者
感谢分享
回复

使用道具 举报

0

主题

1

听众

264

积分

设计实习生

Rank: 2

纳金币
121
精华
0

最佳新人

7#
发表于 2014-2-24 15:50:50 |只看该作者
感谢分享
回复

使用道具 举报

0

主题

0

听众

21

积分

设计初学者

Rank: 1

纳金币
2
精华
0
8#
发表于 2018-12-27 20:50:14 |只看该作者
你好,我看了汽车喷漆效果的实现 这个帖子,有两个问题想请教你,切线转换到世界坐标系下是法线乘以TBN矩阵还是法线乘以TBN的逆矩阵,代码里面的View是什么东西,希望知道的朋友回答我一下哦,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 21:09 , Processed in 0.094361 second(s), 36 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部