- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汽车喷漆效果的实现
图1:双色调,悬浮微鳞片轿车油漆在Direct3D实时象素着色器的效果。给汽车身体喷漆是一个复杂的过程,车身油漆是昂贵分层形式,往往包含染料层,搪瓷金属箔悬浮层.由于这些接二连三油漆表面层,展示出了一种复杂的光学交互,使车看起来平滑,光泽。这了使用的汽车模型的多边形较少,但是引入了高精度的法线贴图(访问 /developer/ 可以获得更多关于法线贴图生成工具的信息),由于像素着色器应用在光滑变化的表面(如车盖),每通道16位的法线贴图是比较适合的。法线贴图解压缩像素着色器中做的第一步就是法线贴图解压缩。因为法线是储存在表面的局部坐标系(也叫做切线空间),我们可以假设法线的z分量是正值。这样,我们能够将x,y分量存在纹理的两个16位的通道中,从而z通过在像素着色器中通过公式 +sqrt(1 – x2 – y2 ) 算出。这样它相对于传统的8-8-8-8的法线贴图,就给了我们更高的精度,但是只占用同样的内存。
图2:双色调,微鳞片,后视镜上的效果图.基础颜色通过上述的法线解压过程,并和当前几何表面的法线合成计算后,我们产生了法线(N),还有一个高频率归一化的噪声图(Nn),它是在表面反复重复着。这两个法线用来计算两扰动法线,用来模拟汽车的双色调和内部微鳞片层。噪声图如下图:
图3:金属微片,悬浮层,搪瓷层、染料层和表层散射效果.这些法线,Ns 和 Nss 计算方法如下:
公式1,2系数a,b,c,d是像素着色器的固定输入常数,它决定了扰动法线的分布。这些摄幅度平均宽度决定在该地区的微型片状随时可见。两个法线都与视向量点乘来作为下列多项式的参数,它决定了基础颜色和微鳞片层的强度系数。
公式3多项式的前三项执行了两个色调中的混合。第四项添加了一个额外层:微鳞片层。常数c0,c1,c2对应于基础颜色层,c3对应于微鳞片层。亮漆层渲染得最后一步就是渲染一个亮漆层,即反射一个环境贴图。环境贴图显示如下:
完整的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,
文档评论(0)