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

这篇博客探讨了线性各向异性与径向各向异性在3D图形渲染中的应用。线性各向异性通过结合贴图的凹凸与高光来创建锐利的边缘效果,而径向各向异性则展示了不同的视觉效果。作者在实现过程中遇到atten衰减因子的问题,并发现其主要影响阴影描绘。通过调整TextureType参数,改善了径向各向异性贴图的抗锯齿效果。博客内容涉及表面着色器、Blinn半角公式以及高光计算,提供了相关代码示例。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

线性各向异性

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

在这里插入图片描述

编(抄)写过程中,一直不太明白 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 才能有拉丝效果。
在这里插入图片描述
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

头发各向异性渲染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操作。 至此,头发渲染完毕。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值