javaee论坛

普通会员

225648

帖子

343

回复

357

积分

楼主
发表于 2019-11-03 06:55:53 | 查看: 511 | 回复: 0

UnityShader布料渲染(丝袜)现实中的丝袜效果丹尼尔值纤维的特性分析效果截图:Weak:Normal:Strong:属性值定义:丹尼尔值与拉伸程度边缘度的计算完整Shader代码

现实中的丝袜效果

主要材质为约90%聚酰胺纤维(锦纶/尼龙)+约10%聚氨酯纤维(氨纶)基本上可以推测这种材质的金属性(Metallic)为0,而光滑度(Smoothness)则根据种类不同会有较大区别。

丹尼尔值

各种丝袜的厚薄也有区别,“D”或“Denier”是指纤维的纤度单位。5D、10D几乎透明,100D以上则几乎不透,很好理解,请看下图:在Shader里我们采用Denier值来表示丝袜的厚薄程度。

纤维的特性

我们可以发现一种现象——靠近腿部中央的位置丝袜颜色较淡,并且如果丝袜够薄甚至会显出底下皮肤的颜色,而越靠近腿两侧丝袜颜色则会越深。丝袜由无数细小交错的纤维组成,所以正对视线的纤维是最稀疏的,而越靠近腿部轮廓的纤维则对于观察者来说越显得密集。

分析

基于PBR,对丝袜纤维的密集程度定义一个属性疏密度(Density),取值范围0(几乎没有纤维)到1(完全被纤维覆盖)。依据疏密度提供颜色给Albedo通道,疏密度越高显现更多丝袜颜色,越低则显现皮肤颜色。

计算疏密度需要三部步骤:1.丹尼尔值对整体疏密度的影响。2.受丝袜良好弹性影响,需要一张灰度贴图来控制不同区域的拉伸程度,拉伸越大疏密度越低。3.受观察者视线的影响,丝袜平面与观察者视线角度越小时,疏密度越大。称其为边缘度影响。

效果截图:Weak:

Normal:

Strong:

属性值定义:Properties{_Denier("Denier",Range(5,120))=25.0_DenierTex("DensityTexture",2D)="black"{}_Smoothness("Smoothness",Range(0,1))=0.1_Metallic("Metallic",Range(0,1))=0.1[Enum(Strong,6,Normal,12,Weak,20)]_RimPower("RimPower",float)=12_FresnelScale("FresnelScale",Range(0,6))=1_SkinTint("SkinColorTint",Color)=(1,0.9,0.8,1)_SkinTex("SkinColor",2D)="white"{}_StockingTint("StockingColorTint",Color)=(1,1,1,1)_StockingTex("StockingColor",2D)="white"{}_NormalTex("Normal",2D)="bump"{}}丹尼尔值与拉伸程度floatdenier=(_Denier-5)/115;floatdensity=denier*(1-tex2D(_DenierTex,IN.uv_DenierTex));边缘度的计算floatrim=pow(1-dot(normalize(IN.viewDir),o.Normal),_RimPower/10);//边缘光floatfresnel=pow(1.0-max(0,dot(normalize(IN.viewDir),o.Normal)),_FresnelScale);//菲涅尔完整Shader代码Shader"Kirk/Stocking"{Properties{_Denier("Denier",Range(5,120))=25.0_DenierTex("DensityTexture",2D)="black"{}_Smoothness("Smoothness",Range(0,1))=0.1_Metallic("Metallic",Range(0,1))=0.1[Enum(Strong,6,Normal,12,Weak,20)]_RimPower("RimPower",float)=12_FresnelScale("FresnelScale",Range(0,6))=1_SkinTint("SkinColorTint",Color)=(1,0.9,0.8,1)_SkinTex("SkinColor",2D)="white"{}_StockingTint("StockingColorTint",Color)=(1,1,1,1)_StockingTex("StockingColor",2D)="white"{}_NormalTex("Normal",2D)="bump"{}}SubShader{Tags{"RenderType"="Opaque"}CGPROGRAM#pragmasurfacesurfStandardfullforwardshadows#pragmatarget3.0structInput{float2uv_SkinTex;float2uv_StockingTex;float2uv_DenierTex;float2uv_NormalTex;float3viewDir;};float_RimPower;float_Denier;float_Smoothness;float_Metallic;float_FresnelScale;float4_SkinTint;float4_StockingTint;sampler2D_DenierTex;sampler2D_SkinTex;sampler2D_StockingTex;sampler2D_NormalTex;voidsurf(InputIN,inoutSurfaceOutputStandardo){o.Normal=UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));//得到法线float4skinColor=tex2D(_SkinTex,IN.uv_SkinTex)*_SkinTint;//内颜色float4stockingColor=tex2D(_StockingTex,IN.uv_StockingTex)*_StockingTint;//外颜色floatrim=pow(1-dot(normalize(IN.viewDir),o.Normal),_RimPower/10);//边缘光floatfresnel=pow(1.0-max(0,dot(normalize(IN.viewDir),o.Normal)),_FresnelScale);//菲涅尔floatdenier=(_Denier-5)/115;//丹尼尔参数floatdensity=max(rim,(denier*(1-tex2D(_DenierTex,IN.uv_DenierTex))));//lerp参数o.Albedo=lerp(skinColor,stockingColor,density);o.Albedo=o.Albedo*(1-fresnel);o.Metallic=_Metallic;o.Smoothness=_Smoothness;}ENDCG}FallBack"Diffuse"}

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

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017