千家信息网

Unity中如何实现仿真丝袜渲染

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。开始吧既然基于PBR,新建一个Surf
千家信息网最后更新 2026年11月01日Unity中如何实现仿真丝袜渲染

这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

开始吧

既然基于PBR,新建一个Surface Shader文件,然后依据需求稍微删改一下:

Shader "Custom/NewSurfaceShader" {    Properties {        _NormalTex("Normal", 2D) = "bump"{}        _Smoothness("Smoothness", Range(0,1)) = 0.5    }    SubShader {        Tags { "RenderType"="Opaque" }        CGPROGRAM        #pragma surface surf Standard fullforwardshadows        #pragma target 3.0        sampler2D _NormalTex;        struct Input {            float2 uv_NormalTex;        };        half _Smoothness;        fixed4 _Color;        void surf (Input IN, inout SurfaceOutputStandard o) {            o.Albedo = 1;            o.Normal = UnpackNormal(tex2D(_NormalTex, IN.uv_NormalTex));            o.Metallic = 0;            o.Smoothness = _Smoothness;            o.Alpha = 1;        }        ENDCG    }    FallBack "Diffuse"}

删除了金属度等一些不需要的属性,加入了法线。
我们就以此为基础,开始我们的丝袜探索之旅吧。

计算

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

计算疏密度需要三部步骤:

  1. 丹尼尔值对整体疏密度的影响。

  2. 受丝袜良好弹性影响,需要一张灰度贴图来控制不同区域的拉伸程度,拉伸越大疏密度越低。

  3. 受观察者视线的影响,丝袜平面与观察者视线角度越小时,疏密度越大。称其为边缘度影响。

对于这几点,我们定义几个属性:

Properties{    _Denier("Denier", Range(5,120)) = 25.0    _DenierTex("Density Texture", 2D) = "black"{}    [Enum(Strong,6,Normal,12,Weak,20)] _RimPower("Rim Power", float) = 12    _SkinTint("Skin Color Tint", Color) = (1,0.9,0.8,1)    _SkinTex("Skin Color", 2D) = "white" {}    _StockingTint("Stocking Color Tint", Color) = (1,1,1,1)    _StockingTex("Stocking Color", 2D) = "white"{}}
(1),(2) 丹尼尔值与拉伸程度贴图
float denier = (_Denier - 5) / 115;float density = denier * (1 - tex2D(_DenierTex, IN.uv_DenierTex));

将_Denier的数值进行归一化(Normalize)。_DenierTex是一张灰度贴图,越淡的地方表示丝袜被拉伸的程度越高,其纤维越稀疏相应会显示更多皮肤颜色。两者相乘。

如示例,一般情况下认为膝盖部分和大腿越靠根部的地方会拉扯的更加厉害。
_Denier 一般只在没有_DenierTex 贴图的情况下做调整用,使用_DenierTex 时请保证_Denier 值为最大(120)以正确还原贴图的效果。

(3) 边缘度的计算

有一种很常见的被称为 Rim Lighting 的效果,简单来说就是模型边缘的内发光效果,简单来说就是模型边缘的内发光效果,我们可以参考其中计算边缘程度的代码。相关代码在Unity官方文档的Surface Shader examples中就可以找到。

根据自己的需求改写:

float rim = pow(1 - dot(normalize(IN.viewDir), o.Normal), _RimPower / 10);

通过点乘(dot)计算视线方向和法线方向的数量积。视线方向与法线方向完全相反时,即丝袜最中心的部分,取得值为1;而最侧边视线方向与法线方向垂直时,取得值为0。因为我们定义的是边缘度,所以应该是越靠边缘值越大,用1与其相减获得正确的数值。最后对数值进行了(_RimPower / 10) 次方,实际应用时,依据效果调整_RimPower,使边缘度更符合现实的情况。

最终混合颜色

首先需要计算出皮肤颜色(SkinColor) 和 丝袜颜色(StockingColor),很简单不多解释。

float4 skinColor = tex2D(_SkinTex, IN.uv_SkinTex) * _SkinTint;float4 stockingColor = tex2D(_StockingTex, IN.uv_StockingTex) * _StockingTint;

依据疏密度对这两个颜色进行简单的混合,疏密度越高显现更多丝袜颜色,越低则显现皮肤颜色,很简单的lerp即可。

lerp(skinColor, stockingColor, density);

完整Shader

Shader "Custom/Stocking" {    Properties{        _Denier("Denier", Range(5,120)) = 25.0        _DenierTex("Density Texture", 2D) = "black"{}        [Enum(Strong,6,Normal,12,Weak,20)] _RimPower("Rim Power", float) = 12        _SkinTint("Skin Color Tint", Color) = (1,0.9,0.8,1)        _SkinTex("Skin Color", 2D) = "white" {}        _StockingTint("Stocking Color Tint", Color) = (1,1,1,1)        _StockingTex("Stocking Color", 2D) = "white"{}        _NormalTex("Normal", 2D) = "bump"{}        _Smoothness("Smoothness", Range(0,1)) = 0.1    }    SubShader{        Tags{ "RenderType" = "Opaque" }        CGPROGRAM        #pragma surface surf Standard fullforwardshadows        #pragma target 3.0        struct Input {            float2 uv_SkinTex;            float2 uv_StockingTex;            float2 uv_DenierTex;            float2 uv_NormalTex;            float3 viewDir;        };        float _RimPower;        float _Denier;        float _Smoothness;        float4 _SkinTint;        float4 _StockingTint;        sampler2D _DenierTex;        sampler2D _SkinTex;        sampler2D _StockingTex;        sampler2D _NormalTex;        void surf(Input IN, inout SurfaceOutputStandard o) {            o.Normal = UnpackNormal(tex2D(_NormalTex, IN.uv_NormalTex));            float4 skinColor = tex2D(_SkinTex, IN.uv_SkinTex) * _SkinTint;            float4 stockingColor = tex2D(_StockingTex, IN.uv_StockingTex) * _StockingTint;            float rim = pow(1 - dot(normalize(IN.viewDir), o.Normal), _RimPower / 10);            float denier = (_Denier - 5) / 115;            float density = max(rim, (denier * (1 - tex2D(_DenierTex, IN.uv_DenierTex))));                        o.Albedo = lerp(skinColor, stockingColor, density);            o.Metallic = 0;            o.Smoothness = _Smoothness;        }    ENDCG    }    FallBack "Diffuse"}

后处理

屏幕空间次表面散射 (SSSSS)

SSSSS你可能不知道,但是SSS你应该听过,就是常说的3S材质。这个是在Github上找到的,利用屏幕空间实现的SSS效果。
最后使用Unity官方的Post Processing Stack对画面进行调整也必不可少的。

链接:
Custom Phase Screen-Space Subsurface Scattering
Post Processing Stack

最终效果

感谢你能够认真阅读完这篇文章,希望小编分享的"Unity中如何实现仿真丝袜渲染"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

丝袜 颜色 疏密 效果 边缘 方向 疏密度 视线 贴图 更多 法线 皮肤 程度 篇文章 纤维 影响 就是 属性 情况 数值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 互联网通讯科技 互联网科技垄断 深圳齐家互联网科技 苏州互联网科技贷款公司 电子科技大学互联网 互联网科技公司招聘 科技与互联网的利与弊 互联网科技与管理 岳阳华臻互联网科技有限公司 青海科技产业互联网发展 允成互联网科技有限公司融资 乌鲁木齐新华智原互联网科技学校 深圳市罗太互联网科技有限公司 有人说阿里系是互联网科技企业 宁波跨境商互联网科技有限公司 三亚科技创新互联网基地 华人运通互联网科技公司 现代科技的标志之一的互联网 每日互联网科技新闻 上海喔噻互联网科技有限公司 金融科技与互联网金融 唐信互联网科技 东莞新华互联网科技学校 山东星卡互联网科技有限公司官网 浙南科技城互联网大厦招聘 互联网相关科技技术 全球科技与互联网公司市值变化 青岛易易互联网科技 平安好医生打造互联网科技医疗
0