Unity Shader 用 Ramp 贴图实现薄膜干涉效果

Shader 学习笔记(9) Ramp贴图 // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' Shader "wx/Ramp"{ Properties{ _Color("Color",Color)=(1,1,1,1) _RampTex("Ramp Tex",2D)="white"{} _Specular("Specular",Color)... 阅读详情

从物理光学原理出发,通过 NdotV 驱动彩虹 Ramp 贴图采样,
在 Unity Shader 中还原肥皂泡、彩色金属镀层等薄膜干涉现象。

什么是薄膜干涉?

薄膜干涉(Thin Film Interference)是光在纳米级薄膜两个界面之间反射后叠加而产生的干涉现象。 当光照射到厚度接近光的波长(几百纳米)的薄膜时,一部分光在膜的上表面反射,另一部分透过薄膜后在下表面反射—— 这两束反射光的光程差决定了它们是相互加强还是相互抵消,从而产生随观察角度变化的彩色条纹。

日常生活中随处可见薄膜干涉现象:肥皂泡的七彩光晕、水面油膜的彩色花纹、CD 光盘的彩虹光泽、 蝴蝶翅膀的结构色,以及各类 PVD 镀膜工艺产生的金属彩色效果。

光程差公式为 Δ = 2n₁d·cosθ,其中 n₁ 是薄膜折射率,d 是膜厚,θ 是光在薄膜内的折射角。 观察角度(即视线与法线的夹角)越大,cosθ 越小,光程差越小,对应不同波长的光发生加强干涉—— 这正是为什么边缘处颜色与中心不同的原因。

💡

在实时渲染中,我们无法逐像素模拟真实的波动光学计算。 核心技巧是:用 NdotV(法线与视线夹角的余弦值)来近似模拟观察角度变化, 再将该值作为 UV 坐标采样一张预制的彩虹渐变 Ramp 贴图,即可得到逼真的薄膜干涉颜色。

Ramp 贴图:预计算的彩虹光谱

Ramp 贴图(渐变贴图/斜坡贴图)是一张横向的渐变纹理,通常分辨率很低(如 256×1 或 256×4), 其核心作用是将单个 0~1 的数值映射为丰富的颜色输出。 在薄膜干涉效果中,我们用 NdotV 作为 U 坐标采样这张彩虹渐变贴图。

薄膜干涉 Ramp 贴图的颜色设计

Ramp 贴图的颜色设计可以参考以下策略:

1

模拟真实薄膜干涉颜色序列

按照干涉条纹的物理颜色顺序排列:黑 → 白 → 黄 → 橙红 → 紫蓝 → 青绿,形成"牛顿环"色序。

2

彩虹全光谱循环

将可见光全光谱(红橙黄绿青蓝紫)首尾相连做成循环渐变,配合偏移量 Shader 参数调节相位,适合炫彩金属镀膜效果。

3

风格化设计

不必完全写实,可以根据美术风格设计特定的 2~3 色渐变,如深海蓝到粉红,模拟鱼鳞或甲壳虫翅膀的金属光泽。

⚠️

制作 Ramp 贴图时,在 Unity 中将纹理的 Wrap Mode 设为 Clamp(而非 Repeat), 避免边缘采样出现错误颜色;同时将 Filter Mode 设为 Bilinear 确保颜色平滑过渡。

NdotV:观察角度的数学表达

NdotV(N dot V,法线与视线方向的点积)是菲涅尔效果、边缘光、薄膜干涉等众多视角相关效果的核心量。 其计算极为简单:

NdotV = saturate(dot(normalWS, viewDirWS))

// normalWS:世界空间法线(单位向量)
// viewDirWS:世界空间观察方向(单位向量,指向摄像机)
// saturate 将结果钳制到 [0, 1] 区间

NdotV = 1 时,视线正对法线(正面),NdotV = 0 时,视线与表面平行(边缘掠射角)。 下图展示了不同 NdotV 值对应的球体位置及其采样到的薄膜颜色:

为什么不用角度而用点积?

点积计算比反余弦更廉价,且 GPU 原生支持。由于 Ramp 贴图是非线性的渐变, 即使 NdotV 是 cosθ 而非 θ 本身,视觉上也没有问题——实际上, Ramp 贴图的设计本身就可以补偿这种非线性,甚至利用它制作更好看的颜色分布。

完整 Shader 代码

下面给出一个基于 Unity Built-in 管线(Surface Shader 变体)和 URP(HLSL)两个版本的实现。 两者核心算法完全相同,差别仅在于渲染管线的接口写法。

版本一:Built-in 管线 Surface Shader

Shader "Custom/ThinFilmInterference"
{
    Properties
    {
        _MainTex        ("Albedo Texture", 2D)     = "white" {}
        _RampTex        ("Film Ramp Texture", 2D) = "white" {}
        _BaseColor      ("Base Color", Color)   = (1,1,1,1)
        _FilmStrength   ("Film Strength", Range(0,1))  = 0.8
        _FilmOffset     ("Film UV Offset", Range(0,1)) = 0.0
        _FresnelPow     ("Fresnel Power", Range(0.1,5))= 1.0
        _Smoothness     ("Smoothness", Range(0,1))  = 0.9
        _Metallic       ("Metallic", Range(0,1))   = 0.5
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _RampTex;
        fixed4    _BaseColor;
        float     _FilmStrength;
        float     _FilmOffset;
        float     _FresnelPow;
        half      _Smoothness;
        half      _Metallic;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;     // Unity 自动填充:世界空间视线方向
            float3 worldNormal; // 世界空间法线
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // 1. 基础纹理颜色
            fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex) * _BaseColor;

            // 2. 计算 NdotV(法线与视线夹角余弦)
            float3 N = WorldNormalVector(IN, o.Normal);
            float3 V = normalize(IN.viewDir);
            float  NdotV = saturate(dot(N, V));

            // 3. 菲涅尔幂次调整(控制颜色在表面上的分布范围)
            float fresnel = pow(NdotV, _FresnelPow);

            // 4. 加入相位偏移,让用户动态调节起始颜色
            float rampU = frac(fresnel + _FilmOffset);

            // 5. 采样 Ramp 贴图(使用固定 V=0.5,水平方向是渐变方向)
            fixed4 filmColor = tex2D(_RampTex, float2(rampU, 0.5));

            // 6. 将薄膜颜色叠加到 Albedo(乘以强度控制)
            o.Albedo     = lerp(albedo.rgb, albedo.rgb * filmColor.rgb * 2.0, _FilmStrength);
            o.Emission   = filmColor.rgb * _FilmStrength * 0.3; // 少量自发光增强通透感
            o.Metallic   = _Metallic;
            o.Smoothness = _Smoothness;
            o.Alpha      = albedo.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

版本二:URP Unlit Shader(HLSL)

Shader "Custom/URP/ThinFilmInterference"
{
    Properties
    {
        _MainTex      ("Albedo", 2D)     = "white" {}
        _RampTex      ("Film Ramp", 2D) = "white" {}
        _FilmStrength ("Film Strength",  Range(0,1))  = 0.8
        _FilmOffset   ("Film UV Offset", Range(0,1))  = 0.0
        _FresnelPow   ("Fresnel Power",  Range(0.1,5))= 1.0
    }

    SubShader
    {
        Tags
        {
            "RenderPipeline" = "UniversalPipeline"
            "RenderType"     = "Opaque"
            "Queue"          = "Geometry"
        }

        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode" = "UniversalForward" }

            HLSLPROGRAM
            #pragma vertex   vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            TEXTURE2D(_MainTex);   SAMPLER(sampler_MainTex);
            TEXTURE2D(_RampTex);   SAMPLER(sampler_RampTex);

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;
                float  _FilmStrength;
                float  _FilmOffset;
                float  _FresnelPow;
            CBUFFER_END

            struct Attributes
            {
                float4 positionOS : POSITION;
                float3 normalOS   : NORMAL;
                float2 uv         : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float2 uv          : TEXCOORD0;
                float3 normalWS    : TEXCOORD1;
                float3 positionWS  : TEXCOORD2;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                VertexPositionInputs posInputs  = GetVertexPositionInputs(IN.positionOS.xyz);
                VertexNormalInputs   normInputs = GetVertexNormalInputs(IN.normalOS);

                OUT.positionHCS = posInputs.positionCS;
                OUT.positionWS  = posInputs.positionWS;
                OUT.normalWS    = normInputs.normalWS;
                OUT.uv          = TRANSFORM_TEX(IN.uv, _MainTex);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // 基础颜色
                half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);

                // 计算世界空间向量
                float3 N     = normalize(IN.normalWS);
                float3 V     = GetWorldSpaceNormalizeViewDir(IN.positionWS);
                float  NdotV = saturate(dot(N, V));

                // 菲涅尔 + 偏移
                float rampU = frac(pow(NdotV, _FresnelPow) + _FilmOffset);

                // 采样薄膜 Ramp 贴图
                half4 filmColor = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, float2(rampU, 0.5));

                // 叠加薄膜颜色
                half3 finalColor = lerp(
                    albedo.rgb,
                    albedo.rgb * filmColor.rgb * 1.8,
                    _FilmStrength
                );

                return half4(finalColor, 1.0);
            }
            ENDHLSL
        }
    }
}

Shader 参数说明

参数类型说明推荐值
_RampTexTexture2D彩虹渐变 Ramp 贴图,水平方向为颜色渐变,需设置 Wrap Mode = Clamp256×4 PNG
_FilmStrengthRange(0,1)薄膜颜色的混合强度,0 = 无效果,1 = 完全薄膜颜色0.6 ~ 0.9
_FilmOffsetRange(0,1)Ramp UV 偏移,改变起始颜色相位,可用于动画驱动0.0 ~ 1.0
_FresnelPowRange(0.1,5)菲涅尔幂次,控制颜色边缘聚集程度,值越大颜色越集中在边缘1.0 ~ 2.0
_SmoothnessRange(0,1)表面光滑度,影响高光大小,薄膜材质通常较高0.85 ~ 0.95
_MetallicRange(0,1)金属度,影响反射颜色,金属镀膜设高,肥皂泡设低0.3 ~ 0.8

进阶技巧与优化

技巧一:多层薄膜叠加(双 Ramp)

真实薄膜干涉往往有多层结构。可以准备两张不同相位的 Ramp 贴图,分别采样后用加法或屏幕混合叠加, 模拟更复杂的干涉条纹,如蝶翅的多层薄膜结构色。

// 双层薄膜叠加
float rampU1 = frac(pow(NdotV, _FresnelPow) + _FilmOffset);
float rampU2 = frac(pow(NdotV, _FresnelPow * 1.5) + _FilmOffset2);

half4 film1 = SAMPLE_TEXTURE2D(_RampTex,  sampler_RampTex,  float2(rampU1, 0.5));
half4 film2 = SAMPLE_TEXTURE2D(_RampTex2, sampler_RampTex2, float2(rampU2, 0.5));

// Screen 混合模式:1-(1-a)*(1-b),颜色更亮且饱和
half3 filmBlended = 1.0 - (1.0 - film1.rgb) * (1.0 - film2.rgb);

技巧二:_Time 驱动动态流动

将 _FilmOffset 用 Unity 内置的 _Time.y 驱动,即可实现颜色随时间缓慢流动的动态效果,非常适合宝石、魔法能量体等特效。

// 在 CBUFFER 中添加速度参数
float _FilmFlowSpeed;

// frag shader 中
float timeOffset = _Time.y * _FilmFlowSpeed;
float rampU     = frac(pow(NdotV, _FresnelPow) + _FilmOffset + timeOffset);
half4 filmColor = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, float2(rampU, 0.5));

技巧三:法线贴图扰动

加入法线贴图后,表面细节会造成法线方向的随机扰动,NdotV 也随之变化, 从而让薄膜颜色在曲面上更自然地流动与变化,避免颜色过于均匀。

// 法线贴图采样(切线空间 → 世界空间)
float3 normalTS  = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, IN.uv));
float3 normalWS  = TransformTangentToWorld(
                      normalTS,
                      half3x3(IN.tangentWS, IN.bitangentWS, IN.normalWS));
float3 N         = normalize(normalWS);

// 后续使用扰动后的 N 计算 NdotV
float NdotV     = saturate(dot(N, V));

技巧四:Shader Graph 可视化实现

在 Shader Graph 中,操作步骤完全一致:Normal Vector → View Direction → Dot Product → Power → Add(加偏移)→ Sample Texture 2D(_RampTex),将输出颜色接到 Emission 或 Base Color 即可。

效果对比展示

下图展示了使用标准 PBR 材质与添加薄膜干涉效果后的视觉对比:

不同 Ramp 贴图的风格对比

如何制作 Ramp 贴图

方法一:在 Photoshop / GIMP 中手绘

新建 256×4 像素的画布,用渐变工具绘制从左到右的彩虹渐变(红→橙→黄→绿→青→蓝→紫→红), 导出为无压缩 PNG。在 Unity 中导入后,设置 Wrap Mode = Clamp,Filter Mode = Bilinear, 关闭 Generate Mip Maps。

方法二:在 Unity Editor 中用脚本生成

using UnityEngine;
using UnityEditor;

public class ThinFilmRampGenerator
{
    [MenuItem("Tools/Generate ThinFilm Ramp Texture")]
    static void GenerateRamp()
    {
        int width  = 256;
        int height = 4;

        Texture2D ramp = new Texture2D(width, height,
                                     TextureFormat.RGBA32, false);
        ramp.wrapMode   = TextureWrapMode.Clamp;
        ramp.filterMode = FilterMode.Bilinear;

        for (int x = 0; x < width; x++)
        {
            // 将 x 映射到 Hue (0~1 循环彩虹)
            float hue   = (float)x / width;
            Color  color = Color.HSVToRGB(hue, 0.85f, 1.0f);

            for (int y = 0; y < height; y++)
                ramp.SetPixel(x, y, color);
        }

        ramp.Apply();

        // 保存为 PNG
        byte[] png  = ramp.EncodeToPNG();
        string path = "Assets/Textures/ThinFilmRamp.png";
        System.IO.File.WriteAllBytes(path, png);

        AssetDatabase.Refresh();
        Debug.Log($"Ramp 贴图已生成:{path}");
    }
}

💡

脚本运行后在 Unity 菜单栏选择 Tools → Generate ThinFilm Ramp Texture, 即可自动在 Assets/Textures/ 目录生成一张彩虹渐变 Ramp 贴图,拖拽到 Shader 的 _RampTex 槽即可使用。

适用的材质与应用场景

薄膜干涉 Shader 的适用范围极为广泛,以下是常见的游戏和影视应用场景:

总结

使用 Ramp 贴图实现薄膜干涉是一个 高性价比 的渲染技巧—— 仅需一次额外的贴图采样,即可显著提升材质的视觉丰富度和物理真实感。 在此基础上,可以进一步扩展为双层薄膜叠加、法线扰动、时间驱动动画等效果, 满足从写实渲染到风格化卡通的各类需求。Ramp 贴图的可设计性使得艺术家可以不依赖程序, 自由定制干涉颜色风格,是技术美术实践中的经典范式之一。

【unity shader】高级光照 --- 薄膜干涉 光照模型是shader编程的核心与基础。 一般的光照模型–不管是lambert还是phong–其实都是对现实光照的模拟。但是现实中的光照效果要复杂得多。但就光的反射而言, 薄膜干涉就是一种非常常见的高级光照效果。 阅读详情

相关推荐

Unity-默认渲染管线-刻晴卡渲shader

Unity-默认渲染管线-刻晴卡渲shader

TingQiaoQiao的博客 1804

Unity下的日式卡通渲染实现-着色篇(一)

这篇文章讲述的是项目中二次元日式卡通着色渲染用到的一些跟着色相关的技术点。 一、卡通着色 何谓卡通着色?大概是让角色看起来卡通的角色吧。这里说的卡通着色,实际上指的是色阶着色。即根据光照和法线计算出当前像素处于哪个色阶,色阶直接有平缓过渡。 1.1 三色阶 如下图所示, 这是一个三阶色的着色结果。可以看到着色结果是明显的三阶,从正对光照到背对光照是过渡分明的白色、灰色、黑色的三色阶。卡通渲染着色最基础的部分就是这种明显过渡的色阶。根据需要,项目中可能采用的是二色阶或者三色阶。我们观察过战双的角色效果,猜测

远行's Blog 9222

Unity风格化水面渲染:从Shader原理到交互实现全解析

在计算机图形学中,Shader是实现视觉特效的核心技术,它通过GPU编程控制像素的渲染方式。其原理在于对顶点和片元进行数学变换与光照计算,从而生成丰富的材质表现。这项技术的核心价值在于,它能让开发者突破物理引擎的限制,为特定艺术目标定制渲染方案,在保证性能的同时实现独特的美术风格。在游戏开发、影视特效和交互媒体等应用场景中,风格化渲染技术尤为重要,它使得卡通、低多边形等非写实风格的作品能够保持视觉统一性。本文聚焦于风格化水面的实现,深入剖析了如何运用噪声函数、深度图采样和UV动画等Shader技术,结合顶点

weixin_30340819的博客 506

Unity shader教程-第六课:Ramp Texture

Ramp Texture在Valve公司的军团要塞2后开始成为一种控制漫反射的方法。   Ramp Texture是类似下图的一张贴图:   在一般的Blinn/Phong模型中,我们对漫反射的系数是基于入射光和击中的点的法线的角度。在这种情况下,系数的计算代码大致如下: float DiffuseCoeff(in float3 pos, in flo

化石 1万+

PBR流程常用的几种贴图类型

基于物理的渲染(PBR)是一种着色和渲染的方式,能更精准的体现光线和介质表面的交互方式。因此称作基于物理的渲染(PBR)或者基于物理的着色(PBS)。从正在讨论的工作流程角度而言,PBS通常针对着色概念,PBR针对渲染和光线的概念。但是,PBS和PBR都是从物理上精确的角度描述呈现物体的过程。基于物理纹理的渲染(PBR)是一种方法而不是硬标准,有具体的基本准则和使用指南,但没有真正具体的规则。也就是PBR的使用方法多种多样,使用的贴图类型和工作流程也不一样。通常使用GCX BRDF,但是术语也会有变化。

weixin_45810196的博客 7804

【unity shader】高级光照 -- fresnel方程和肥皂泡

接上面的一篇文章:薄膜干涉。上篇博客最后讲到利用fresnel equation实现薄膜干涉。其实fresnel equation同时也提供了光的折射信息,因为能量是守恒的,有多少光被反射,就有多少剩下的被折射了。 本文中将试着利用fresnel equation做一个肥皂泡,实现光的薄膜干涉和色散效果。fresnel方程当一束光L射向介质的界面时候,反射光R,折射光T的大小都可以用f

CMOSTER的隐秘修行 3055

Unity特效进阶:用Ramp贴图高效模拟薄膜干涉流光效果

在实时渲染领域,纹理采样是连接艺术表现与程序逻辑的核心技术之一。Ramp贴图作为一种一维渐变纹理,其原理是通过一个标量输入值(UV的U坐标)快速查找并输出对应的颜色值,将复杂的颜色计算简化为一次高效的纹理采样操作。这项技术的核心价值在于,它完美地解耦了视觉效果与底层计算逻辑,使美术人员能够通过直接编辑贴图来自由控制色彩表现,而程序员则专注于设计驱动采样的参数因子。在游戏特效、角色技能和场景氛围营造等应用场景中,这种方案能以极低的性能开销,实现诸如能量护盾、武器光效和奇幻材质表面等需要丰富色彩动态变化的视觉效

weixin_34327761的博客 423

【GPU Gems 学习笔记】Iridescence : Simulating Diffraction

一. 光学现象 物体表面受光呈现七彩色,且会随着光照方向或观察视角的不同而改变,这是一种光学现象,比如说常见的彩虹。 彩虹是由于水滴中光的反射、折射和色散引起的。因为空气中存在的小水珠对各种频率的光具有不同的折射率,使各种色光的传播方向在进入和离开小水珠时各发生一次不同程度的偏折,使复色光分解为单色光,从而形成光谱产生的。 再比如混合了油的水和肥皂泡也有"彩虹"现象,这是由于薄膜...

LeeMcXxs的博客 1336

Unity Shader 使用Matcap+Ramp 制作薄膜蝉翼甲壳虫

摘要:本文介绍了一种结合Matcap和Ramp贴图的Shader技术,用于模拟甲壳虫鞘翅或蝴蝶翅膀的虹彩效果。通过Matcap层实现基础光泽感,利用Ramp层根据视角变化产生色彩渐变。核心原理是将模型法线转换为视角空间UV采样Matcap贴图,同时通过NdotV值采样Ramp贴图模拟薄膜干涉效应。文章提供了完整的URP Shader代码,包含参数调节建议,并建议通过混合模式调整和NPR风格化进行效果扩展。该技术可实现随视角变化的流光溢彩效果,适用于各类虹彩材质表现。

mxwin的博客 422

【Unity Shader入门】☀️ | 使用Shader实现一个彩虹球效果✨!闪闪发光的特效离我又近了一步!

使用Unity通过Shader制作一个简单的七彩彩虹特效,快来学习一下吧!

努力前行,总会成为自己心中的那道光 1万+

薄膜干涉的仿真

对单层膜反射系数、反射率及相位因子进行计算,其中玻璃基片n=1.5,薄膜折射率依次取1.0、1.2、1.4、1.5、1.7、2.0、3.0,绘出反射率随薄膜厚度,入射角及波长的变化曲线。总结薄膜反射的特点。

Unity薄膜干涉着色器:实现物理真实的彩虹泡泡效果

薄膜干涉是光学中描述光在透明薄膜表面反射叠加产生彩色条纹的基础现象,其原理源于光程差引发的相长与相消干涉。在实时渲染领域,该效应可被数学建模为波长选择性衰减与视角相关相位变化,具备明确物理参数(膜厚、折射率、入射角)和可调控输出特性。技术价值在于以轻量浮点运算替代贴图或动画,兼顾移动端性能与视觉真实感,广泛应用于AR交互UI、数字孪生材质表现及高质感3D界面设计。本方案聚焦Unity引擎下基于HLSL手写着色器的工程落地,深度融合肥皂泡光学模型与GPU指令优化策略,解决Pico4等XR设备上的精度、性能与兼

weixin_27945229的博客 275

薄膜干涉的仿真程序

% n1=1.2 n0=1; n2=1.5; n1=1.2; langmuda=400*10^(-9); h=0:0.0001*langmuda/1.2:langmuda/1.2; x=n1*h; j0=0; j1=asin(n0*sin(j0)/n1); f=4*pi*n1*h*cos(j1)/langmuda; a=n0-n2; b=n0+n2; c=((n0.*n2)./n1)-n1; d=((n0.*n2)./n1)+n1; A=a^2*(cos(f/2).^2)+c^2*(sin(f/2).^2); B=b^2*(cos(f/2).^2)+d^2*(sin(f/2).^2); R=A./B; plot(x,R,'-r'); hold on; %n1=1 n0=1; n2=1.5; n1=1; langmuda=400*10^(-9); h=0:0.0001*langmuda:langmuda; x=n1*h; j0=0; j1=asin(n0*sin(j0)/n1); f=4*pi*n1*h*cos(j1)./langmuda; a=n0-n2; b=n0+n2; c=((n0.*n2)./n1)-n1; d=((n0.*n2)./n1)+n1; A=a.^2.*(cos(f./2).^2)+c.^2.*(sin(f./2).^2); B=b.^2.*(cos(f./2).^2)+d.^2.*(sin(f./2).^2); R=A./B; plot(x,R,'-k'); hold on;

技术美术(7.31)样例五彩甲壳虫-Matcap材质

选择层级后,再创建一个Post-Process Volume。新建一个file后然后添加一个色彩映射。

qq_44924388的博客 232

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位

本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。

rice5的博客 949

Python小白也能搞定!用you-get一键下载B站视频合集的保姆级教程

本文为Python新手提供了使用you-get工具一键下载B站视频合集的完整教程。从环境配置、基础下载操作到高级批量下载技巧,详细介绍了如何利用这个开源工具高效获取视频资源,包括解决常见问题和实用优化建议,帮助用户轻松实现离线学习。

weixin_42544663的博客 458

Unity模拟薄膜干涉效果

这次来做一个模拟薄膜干涉的彩色效果,Shader是使用ASE来连接,也算是ASE做复杂一点的效果的一个例子吧。

阿赵的博客 1390

抖音Web端私信Protobuf逆向解析实战

本文详细解析了抖音Web端私信通信的逆向过程,发现其核心采用WebSocket传输Protobuf序列化数据。通过抓包获取二进制样本,利用protoc工具进行原始解码,并逐步推导和编写出对应的.proto协议定义文件,最终实现模拟消息的编码与解码,为理解私有协议逆向提供了完整实战案例。

water的专栏 761

【学习】原神材质ShaderGraph实现笔记

本文主要是参考学习了B站大佬的原视频来实现类原神材质,这里主要是自己的心得和笔记。

coldbluer的博客 4720

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

创意视觉项目实战:用ESP32-S3+OV5640构建智能图像流系统

本文详细介绍了如何使用ESP32-S3开发板与OV5640摄像头模块构建智能图像流系统。从硬件连接到软件配置,涵盖Arduino环境搭建、图像采集优化、WiFi视频流传输及外设集成,为开发者提供完整的实战指南,助力智能家居和机器人视觉项目开发。

tech5的博客 1291

寄存器分配图着色_【02】从零开始的卡通渲染-着色篇1

专栏目录2173:【01】从零开始的卡通渲染-描边篇​zhuanlan.zhihu.com2173:【02】从零开始的卡通渲染-着色篇1​zhuanlan.zhihu.com2173:【03】从零开始的卡通渲染-着色篇2​zhuanlan.zhihu.com2173:【04】从零开始的卡通渲染-PBR篇​zhuanlan.zhihu.com序言:接上一篇的描边篇,整理成一个专栏了。在本节中,我们开...

weixin_32556315的博客 694

Arcgis模型构建器01——写一个简单的模型

在使用模型构建器解决这个需求之前,我们要想清楚如果我们手动解决的话,应该如何去处理,因为构建模型的过程正是基于我们手动处理的过程来构建的。我有一个全国的dem影像数据和一个陕西省边界范围矢量,现在我想获取陕西省的dem影像的坡度数据。填写完之后点击确定,我们发现,两个输入数据和工具连接起来了,并且通过裁剪工具得到一个中间结果,即。我们发现工具框和中间数据框都存在阴影,说明已经运行过了这个模型,不报错就说明模型运行成功!现在我们就把数据和工具都串联起来了,成功构建好了模型。

爱吃雪糕的小布丁的博客 918

【Unity Shader URP】色带渐变着色(Ramp Shading)实战教程

色带渐变着色(Ramp Shading)是最灵活的非真实感光照技巧之一:把 NdotL 当"索引",用一张 1D 渐变贴图查表,让光影过渡完全由美术控制。卡通赛璐珞硬切、冷暖色调渐变、金属质感色带——换张贴图就换一种风格,代码不用动。

Fresh_Free的博客 591

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

本项目旨在分析往届世界杯比赛数据,找出规律,最后使用决策树算法构建世界杯比赛预测模型,给出两个球队即可预测胜率,可以给爱看球的小伙伴提供一个参考。本次实验我们使用了2018年及其之前的世界杯比赛数据,通过建立决策树模型,模型准确率为82%,接着我们使用该模型预测了2022年世界杯的5场半决赛及决赛,模型准确率也是接近80%的,说明模型效果还是很不错的。心得与体会:通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。

m0_64336780的博客 1万+

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6108
上一篇: Unity Shader 使用 Noise 图 制作Shader 溶解效果
下一篇: Unity Shader FLOWMAP岩浆流动制作案例
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值