Shader攻占笔记(五)各向异性应用

线性各向异性

在这里插入图片描述
主要思路:根据贴图的凹凸部分叠加原有的高光部分,将边缘进行锐利的衰减操作。主要代码都来自课本内代码,有小部分更改。

在这里插入图片描述

编(抄)写过程中,一直不太明白 atten(衰减因子)表示什么。输出后发现得到下图:
在这里插入图片描述
在这里插入图片描述
发现 atten 是对影子的描绘;atten为1的时候(无衰减)和关闭阴影得到的结果是一样的。
在这里插入图片描述

表面着色器部分编写如常;光照部分代码:

half4 LightingAnisotropic(SurfaceAnisoOutput s, float3 lightDir, float3 viewDir, fixed atten)
        {
            //形容该点光照强度
            float NdotL = max(0.01, dot(s.Normal, lightDir));
            //通过Blinn半角公式得到高光点
            //NdotH描述本身物体光照与半角高光的契合度
            fixed3 halfVector = normalize(normalize(lightDir) + normalize(viewDir));
            fixed NdotH = dot(normalize(s.Normal + s.AnisoDirection), halfVector);
            //2.5描述同一面上出现圈环的层数;4以下较为自然
            float aniso = max(0, sin((NdotH + _AnisoOffset) * 2.5));
            //对环状高光进行进一步聚拢
            float spec = saturate(pow(aniso, s.Gloss * 128) * s.Specular);

            //最终颜色 = (本身颜色*light0颜色*漫反射 + 光色*高光强度)* 衰减因子
            fixed4 c;
            c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + 
                    (_LightColor0.rgb * spec)) * (atten);
            c.a = 1.0;
            return c;
        }

径向各向异性

换了一张贴图,代码与线性各向异性相同。

在这里插入图片描述
导入过程中发现径向这张图的 Texture Type 调成 Cursor 后抗锯齿效果会好一些;而线性各向异性的贴图保持 Default 才能有拉丝效果。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
头发各向异性渲染Shader 这个是04年的一个ppt,主要介绍了头发的渲染,其追到源头还是要看这个原理。 各向异性的主要计算公式: 主要代码如下: 切线混合扰动部分(这部分也可以用T+k*N,来对切线进行扰动): float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir); float3 _T_var = UnpackNormal(tex2D(_Tangent, TRANSFORM_TEX(i.uv0, _Tangent))); float3 temp = lerp(_TangentParam.xyz, _T_var, _BlenfTangent); float3 T = normalize(mul(float3(temp.xy,0), tangentTransform)); 主要是通过改变切线的xy值来造成头发高光部分的多样性。 高光部分,按公式计算即可: float StrandSpecular(float3 T, float3 V, float3 L, float exponent) { float3 H = normalize(L + V); float dotTH = dot(T, H); float sinTH = sqrt(1 - dotTH*dotTH); float dirAtten = smoothstep(-1, 0, dotTH); return dirAtten*pow(sinTH, exponent); } 注意,为了模拟的更贴近真实性,应用两层高光,第一层高光代表直射光直接反射出去,第二层代表次表面散射现象具体看代码。 最终渲染部分: float4 HairLighting(float3 T, float3 N, float3 L, float3 V, float2 uv, float3 lightColor) { float diffuse = saturate(lerp(0.25, 1.0, dot(N, L)))*lightColor; float3 indirectDiffuse = float3(0, 0, 0); indirectDiffuse += UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Light float3 H = normalize(L + V); float LdotH = saturate(dot(L, H)); float3 specular = _Specular*StrandSpecular(T, V, L, exp2(lerp(1, 11, _Gloss))); //float specMask = tex2D(_SpecMask, TRANSFORM_TEX(uv, _SpecMask)); specular += /*specMask*/_SubColor*StrandSpecular(T, V, L, exp2(lerp(1, 11, _ScatterFactor))); float4 final; float4 base = tex2D(_MainTex, TRANSFORM_TEX(uv, _MainTex)); float3 diffuseColor = (_Color.rgb*base.rgb); //float ao = tex2D(_AO, TRANSFORM_TEX(uv, _AO)).g; final.rgb = (diffuse + indirectDiffuse)*diffuseColor + specular*lightColor* FresnelTerm(_Specular, LdotH); //final.rgb *= ao; final.a = base.a; clip(final.a - _CutOff); return final; } 这里我注释掉了AO和高光遮罩,需要的同学可以加上。 最后一点为了不让头发的边经过clip之后太硬,需要进行两个通道的belnd。 第二个pass使用以下指令: Blend SrcAlpha OneMinusSrcAlpha ZWrite Off 注意第二个通道无需再进行clip操作。 至此,头发渲染完毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值