使用ShaderGraph制作URP各向异性

前言:

网上全是代码的各向异性效果,做一个shaderGraph连连看,里面用一个AniF.hlsl方法,分别将(bitangentWS ,normalWS,转换一下

(是网上另一个各向异性效果,使用shader写成)

原理如下:

各向异性的公式原理就不说,网上大把,直接搜索就有,下面的我的找到一个简单算法

            half StrandSpecular(half3 bitangentWS,half3 viewDirWS,half3 lightDirWS,half exponent)
            {
                half3 H = normalize(lightDirWS + viewDirWS);
                half dotTH = dot(bitangentWS,H); 
                half sinTH = sqrt(1.0 - dotTH * dotTH);
                half dirAttenuation = smoothstep(-1.0,0.0,dotTH);
                return dirAttenuation * pow(sinTH,exponent);
            }

另一个是核心是ShiftTangent是U3D内置的参数

half3 t1 = ShiftTangent(bitangentWS,normalWS,_Shift + shiftTex);

其实网上全是shader版本的,shaderGraph版本方便修改,基本就是高光,这里的核心是shiftTex,就是拉丝噪点图,也可用于头发效果

ShaderGraph连连看图如下

URP

直接上算法:
#ifndef MYANI_INCLUDED
#define MYANI_INCLUDED

void ANI_half(half3 lightDir,half3 shiftTex, half Shift, half powerVal, half3 bitangent, half3 viewDir, half3 normal, out half AniVal)
{
    half3 viewDirVal = SafeNormalize(viewDir);

    //half3 lightDir = half3(0,1,0);
    lightDir = normalize(lightDir);
    half3 halfDir = normalize(-viewDirVal + lightDir);
    /*
    float nh = dot(normal, halfDir);
    nh = max(0.0001, nh);
    float spec = pow(nh, powerVal);
    */
 
    //float3  shiftTex=float3(0.5,0.5,0.5);
    shiftTex.r -= 0.5;
    half shiftTex2 = Shift + shiftTex.r;
    
    half3 normalWS = normalize(normal);
    half3 bitangentWS = cross(normalWS, bitangent);
    half3 tangent = ShiftTangent(bitangentWS, normal, shiftTex2);
    float dotTH = dot(tangent, halfDir);
    float dirAtten = smoothstep(-1., 0., dotTH);
    float sinTH = sqrt(1. - dotTH * dotTH);
    sinTH=max(0.0001, sinTH);
    AniVal = dirAtten * pow(sinTH, powerVal);
    
    //AniVal = spec;

   // half3 hairColor = LightingHair(bitangentWS, light.direction, normalWS, viewWS, IN.texcoord, _SpecularExp, _SpecularColor.rgb);
}




#endif

下载地址

https://download.csdn.net/download/dreamform/88864713

头发各向异性渲染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操作。 至此,头发渲染完毕。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值