Unity Shader入门:从零实现Lambert漫反射与逐顶点/逐像素光照对比
1. 项目概述为什么Lambert漫反射是Shader入门的“第一道坎”如果你刚开始接触Unity Shader编程面对各种光照模型和复杂的数学公式感到无从下手那么从Lambert漫反射模型开始绝对是最明智的选择。我见过太多新手一上来就想搞懂PBR基于物理的渲染或者各种酷炫的后处理效果结果在复杂的BRDF方程和能量守恒概念面前败下阵来最终失去了学习的兴趣。Lambert模型不一样它简单、直观是理解光线与物体表面交互最基础的物理模型堪称图形学里的“Hello World”。简单来说Lambert漫反射描述的是理想漫反射表面的光照现象。想象一下一个粗糙的石膏像或者一张无光的A4纸光线照上去后会均匀地向四面八方散射因此从任何角度看过去它的亮度都是一样的。这个模型的核心公式极其简洁最终颜色 光源颜色 * 材质漫反射颜色 * max(0, dot(表面法线, 光源方向))。这里的dot就是点积运算它计算的是法线与光线方向夹角的余弦值。夹角越小光线越正对表面余弦值越接近1表面就越亮夹角大于90度时余弦值为负我们通过max(0, ...)将其截断为0表示背光面完全不受该光源影响。这个项目我们将不依赖Unity表面着色器Surface Shader的“黑箱”也不直接使用内置的Lambert光照模型函数而是从零开始用两种最经典的方式——逐顶点光照和逐像素光照——来手动实现它。你会清晰地看到同样的光照模型仅仅因为计算发生的位置不同是在每个顶点上算一次还是在每个屏幕像素上算一次最终呈现的视觉效果和性能开销会有天壤之别。文末附上的完整代码对比能让你一目了然地抓住两种实现的核心差异。无论你是想解决模型在低光下显得“平板”的问题还是想为后续学习Blinn-Phong高光、卡通渲染打下坚实基础这次“手把手”的实战都能给你带来最直接的收获。2. 核心原理与设计思路拆解逐顶点与逐像素的本质区别在动手写代码之前我们必须把“逐顶点”和“逐像素”这两个概念彻底吃透。这不仅仅是代码写在哪个函数里的区别更决定了着色器的视觉质量和运行效率是Shader编程中最重要的设计决策之一。2.1 光照计算发生在哪里这是最根本的区别。你可以把三维模型理解成一个由许多三角形面片构成的网格三角形的三个角就是顶点。逐顶点光照光照计算发生在顶点着色器中。程序会遍历模型的每一个顶点根据该顶点的位置、法线等信息计算出该顶点受到光照后的颜色。然后这个颜色值会从顶点着色器输出在光栅化阶段即把三角形画到屏幕上的过程中由GPU自动在三角形的三个顶点颜色之间进行线性插值生成三角形内部每个像素的颜色。逐像素光照光照计算发生在片元着色器也叫像素着色器中。顶点着色器只负责顶点的基本变换如从模型空间转到世界空间和传递必要的数据如法线、光照方向。当三角形被光栅化后对于覆盖的每一个屏幕像素片元着色器都会被执行一次并利用插值后的法线、光照方向等数据独立计算该像素的光照颜色。2.2 视觉差异的根源插值 vs 独立计算正是上述流程的差异导致了截然不同的视觉效果。逐顶点的“棱角感”由于颜色是在顶点上计算的三角形内部像素的颜色只是顶点颜色的简单混合。如果模型面数较少顶点稀疏那么在三角形内部的大片区域颜色变化会非常平缓甚至不变而在三角形边缘顶点处则可能发生突变。这就会导致模型表面出现明显的“色块”或“棱角”尤其是在低多边形模型上光照过渡非常不自然。你可以想象一个低精度的球体它的表面是由许多小平片组成的逐顶点光照会让每个小平片内部颜色一致整个球体看起来就像个多面体。逐像素的“平滑感”因为每个像素都独立计算了一次光照即使模型面数很低只要法线信息是连续插值的通常我们使用顶点法线并在片元着色器中获取插值后的法线那么计算出的光照强度就会在每个像素上精细变化。这样得到的渲染结果非常平滑能很好地表现曲面的光影过渡视觉质量高得多。2.3 性能开销的权衡计算频率的博弈性能是另一个关键的考量维度。逐顶点开销低一个模型的顶点数量通常是有限的即使是上万个顶点的复杂模型其顶点数也远少于它最终在屏幕上覆盖的像素数尤其是近处特写的物体。在顶点着色器中计算光照计算次数等于顶点数相对较少。逐像素开销高片元着色器的执行次数等于该物体覆盖的屏幕像素数量。一个1080p的屏幕就有超过200万个像素。如果模型占据了屏幕的一半那么片元着色器就要执行上百万次每次执行都要进行点积、乘法等运算。因此逐像素光照的计算压力要大得多。设计思路总结我们的实现方案就是围绕这个核心矛盾展开的。我们将编写两个独立的Shader一个采用逐顶点计算策略追求极致性能适用于对光影效果要求不高或受性能严格约束的场景如大量重复的远景物体。另一个采用逐像素计算策略追求视觉质量适用于场景中的主角、主要道具等需要精细表现的物体。通过对比这两种实现你能深刻理解Shader编程中“质量与性能”的永恒权衡。3. 环境准备与基础代码框架在开始实现具体的光照模型前我们需要搭建一个最基础的、无光照的Shader框架。这个框架负责完成顶点从模型空间到裁剪空间的变换是任何Vertex/Fragment Shader的起点。3.1 创建Shader与材质首先在Unity项目中创建一个新的Standard Surface Shader并修改或者直接创建Unlit Shader来从头编写。这里我们选择从Unlit Shader开始以获得最大的控制权。将其命名为LambertPerVertex和LambertPerPixel。一个最基础的顶点/片元着色器结构如下Shader Custom/LambertBase { Properties { _MainTex (Texture, 2D) white {} _Color (Color, Color) (1,1,1,1) } SubShader { Tags { RenderTypeOpaque } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Color; v2f vert (appdata v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); // 核心变换模型空间-裁剪空间 o.uv TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col tex2D(_MainTex, i.uv) * _Color; return col; } ENDCG } } }这段代码没有任何光照它只是把纹理和颜色显示出来。UnityObjectToClipPos是Unity内置的宏它等价于mul(UNITY_MATRIX_MVP, v.vertex)负责将顶点从模型空间转换到裁剪空间这是顶点着色器最核心的任务。3.2 关键数据结构appdata 与 v2f理解appdata顶点着色器输入和v2f顶点着色器输出片元着色器输入的结构体是写Shader的基本功。appdata定义了从模型网格中读取哪些数据。POSITION是顶点位置TEXCOORD0是第一套纹理坐标这些都是模型自带的。为了实现光照我们后面必须在这里加入NORMAL法线语义。v2f定义了从顶点着色器传递给片元着色器的数据。SV_POSITION是经过变换后的裁剪空间坐标必须要有。其他的如纹理坐标、法线、光照方向等都需要在这里声明并在顶点着色器中赋值。注意从顶点着色器到片元着色器的数据传递是通过插值器完成的。即使你在顶点着色器中把法线归一化长度为1了经过插值后传入片元着色器的法线长度很可能不再是1。因此在逐像素光照的片元着色器中必须对传入的法线重新进行归一化使用normalize函数这是一个非常高频的坑点。4. 逐顶点光照Lambert实现详解现在我们开始实现第一个版本在顶点着色器中完成Lambert光照计算。4.1 修改数据结构与属性首先我们需要让Shader能获取到法线信息并定义一个颜色属性来表示物体的固有色。Properties { _MainTex (Texture, 2D) white {} _Color (Diffuse Color, Color) (1,1,1,1) // 物体漫反射颜色 }接着修改结构体在appdata中加入法线在v2f中加入一个变量来存储计算好的顶点颜色。struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; // 加入法线 float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; fixed3 diffuse : COLOR; // 新增用于存储顶点计算出的漫反射颜色 };4.2 顶点着色器中的光照计算核心逻辑全部在顶点着色器vert函数中。v2f vert (appdata v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv TRANSFORM_TEX(v.uv, _MainTex); // --- 逐顶点光照计算开始 --- // 1. 将法线从模型空间转换到世界空间并归一化 float3 worldNormal normalize(mul(v.normal, (float3x3)unity_WorldToObject)); // 注意这里用unity_WorldToObject的逆转置矩阵来变换法线等同于mul(transpose(unity_WorldToObject), v.normal)这是处理非均匀缩放的正确方法。UnityCG.cginc中通常提供了UnityObjectToWorldNormal宏来简化。 // 2. 获取世界空间下的光源方向假设主要平行光 float3 worldLightDir normalize(_WorldSpaceLightPos0.xyz); // _WorldSpaceLightPos0是Unity内置变量对于平行光其xyz分量表示方向w分量为0。 // 3. 计算Lambert漫反射系数 float lambert max(0, dot(worldNormal, worldLightDir)); // 4. 结合光源颜色和物体颜色得到最终顶点颜色 // _LightColor0是Unity内置变量表示当前处理的光源颜色。 o.diffuse _LightColor0.rgb * _Color.rgb * lambert; // --- 逐顶点光照计算结束 --- return o; }这里使用了_WorldSpaceLightPos0和_LightColor0这两个Unity内置变量它们代表了场景中第一个通常是主要的平行光的方向和颜色。在实际项目中为了兼容多光源和更复杂的情况可能需要编写多Pass或使用光照衰减纹理但作为Lambert入门理解单平行光就足够了。4.3 片元着色器输出片元着色器变得非常简单只需要输出插值后的颜色即可。可以混合纹理。fixed4 frag (v2f i) : SV_Target { fixed4 col tex2D(_MainTex, i.uv); // 将纹理颜色与计算好的漫反射光颜色相乘 col.rgb * i.diffuse; return col; }4.4 效果与局限性分析将此Shader赋给一个低多边形模型比如一个Sphere只设置少量分段你会看到明显的光照色块。球体看起来不像光滑的球而像一个多面体。这是因为颜色在顶点计算后在面片内部只是线性渐变无法体现精细的光影变化。逐顶点光照的优缺点与适用场景优点计算量小性能极高。在功能机时代或对性能要求极度苛刻的场景如海量单位渲染的RTS游戏中仍有其用武之地。缺点视觉质量差尤其在低模上棱角感明显。无法支持法线贴图因为法线贴图需要逐像素的法线信息。适用场景远景物体、大量重复的植被/粒子、移动平台性能瓶颈时的备选方案。5. 逐像素光照Lambert实现详解接下来我们实现视觉质量更好的逐像素版本。核心思想是将计算从顶点着色器推迟到片元着色器。5.1 修改数据结构传递插值数据我们不再在v2f中传递计算好的颜色而是传递世界空间下的法线和光照方向让片元着色器自己去算。struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldNormal : TEXCOORD1; // 传递世界空间法线 float3 worldLightDir : TEXCOORD2; // 传递世界空间光源方向 };5.2 顶点着色器准备数据顶点着色器负责进行坐标变换和计算世界空间下的向量但不进行点积计算。v2f vert (appdata v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv TRANSFORM_TEX(v.uv, _MainTex); // 准备数据变换法线到世界空间 // 使用Unity内置宏它自动处理了逆转置矩阵更安全便捷。 o.worldNormal UnityObjectToWorldNormal(v.normal); // 准备数据获取世界空间光源方向 // 对于平行光_WorldSpaceLightPos0.xyz即方向。这里先计算到顶点的向量但对于平行光所有顶点方向相同。 // 更严谨的写法是o.worldLightDir normalize(_WorldSpaceLightPos0.xyz - worldPos.xyz); 对于平行光worldPos部分无效。 // 我们使用简化写法直接取方向。 o.worldLightDir normalize(_WorldSpaceLightPos0.xyz); return o; }5.3 片元着色器执行核心计算所有光照计算的精华现在都集中在片元着色器中。fixed4 frag (v2f i) : SV_Target { fixed4 col tex2D(_MainTex, i.uv); // --- 逐像素光照计算开始 --- // 关键步骤必须重新归一化插值后的向量长度可能不是1。 float3 worldNormal normalize(i.worldNormal); float3 worldLightDir normalize(i.worldLightDir); // 虽然顶点已归一化但插值后仍需归一化 // 计算Lambert系数 float lambert max(0, dot(worldNormal, worldLightDir)); // 计算最终漫反射颜色 fixed3 diffuseColor _LightColor0.rgb * _Color.rgb * lambert; // --- 逐像素光照计算结束 --- col.rgb * diffuseColor; return col; }5.4 效果提升与性能考量使用同一个低多边形球体应用此Shader你会立刻看到平滑、连续的光照过渡球体看起来非常圆润。这就是逐像素计算带来的质变。逐像素光照的优缺点与适用场景优点视觉质量极高光照平滑能完美支持法线贴图、凹凸贴图等需要逐像素细节的技术。缺点计算量大片元着色器的负担重是渲染管线中常见的性能瓶颈。适用场景场景中的主角、主要道具、UI特效、以及任何需要高质量视觉表现的物体。这是现代游戏中最主流的光照计算方式。实操心得在实际项目中我们几乎总是使用逐像素光照。除非经过Profiler严格分析确定某处是GPU的片元着色器瓶颈并且物体确实适合用逐顶点近似如非常远的山体否则不要轻易使用逐顶点光照。视觉质量的优先级通常高于那一点性能提升。6. 完整代码对比与关键差异解析为了方便你整体理解和对比我将两个版本的简化核心代码并置如下。删除了纹理采样部分以突出光照计算逻辑。逐顶点光照 Lambert Shader 核心代码// 顶点着色器输出结构 struct v2f { ... fixed3 diffuse : COLOR; // 颜色在顶点算好 }; v2f vert (appdata v) { v2f o; ... // 所有计算在顶点完成 float3 worldNormal UnityObjectToWorldNormal(v.normal); float3 worldLightDir normalize(_WorldSpaceLightPos0.xyz); float lambert max(0, dot(worldNormal, worldLightDir)); o.diffuse _LightColor0.rgb * _Color.rgb * lambert; // 赋值结果 return o; } fixed4 frag (v2f i) : SV_Target { ... // 片元着色器直接使用插值后的颜色 col.rgb * i.diffuse; return col; }逐像素光照 Lambert Shader 核心代码// 顶点着色器输出结构 struct v2f { ... float3 worldNormal : TEXCOORD1; // 传递向量 float3 worldLightDir : TEXCOORD2; }; v2f vert (appdata v) { v2f o; ... // 只准备数据不计算光照 o.worldNormal UnityObjectToWorldNormal(v.normal); o.worldLightDir normalize(_WorldSpaceLightPos0.xyz); // 传递方向 return o; } fixed4 frag (v2f i) : SV_Target { ... // 所有计算在片元完成 float3 worldNormal normalize(i.worldNormal); // 必须重新归一化 float3 worldLightDir normalize(i.worldLightDir); float lambert max(0, dot(worldNormal, worldLightDir)); fixed3 diffuseColor _LightColor0.rgb * _Color.rgb * lambert; col.rgb * diffuseColor; return col; }关键差异总结表特性逐顶点光照逐像素光照计算位置顶点着色器片元着色器计算频率每顶点一次每像素一次视觉质量低有棱角感高平滑连续性能开销低高数据结构传递计算好的颜色(COLOR)传递向量(TEXCOORD)需在片元重新归一化支持法线贴图否是典型应用性能优先的远景/大量物体质量优先的主角/近景物体7. 常见问题、优化技巧与扩展思路在实际应用这两个基础Shader时你肯定会遇到各种问题。这里我总结了一些常见坑点和优化技巧。7.1 常见问题排查模型全黑或光照方向不对检查法线确保模型导入设置中“法线”计算正确。可以在材质中使用“法线”显示模式查看。检查光源场景中必须有启用的平行光。_WorldSpaceLightPos0和_LightColor0来自前向渲染路径中的主平行光。检查向量空间确保法线和光源方向在同一空间通常是世界空间下计算点积。一个在模型空间一个在世界空间结果肯定是错的。背光面全黑没有环境光这是经典Lambert模型的特性。可以通过添加环境光项来改善。在片元着色器中最终颜色可以改为finalColor UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb diffuseColor。UNITY_LIGHTMODEL_AMBIENT是Unity内置的环境光颜色。逐像素版本下模型边缘有锯齿或闪烁这可能是由插值器精度引起的。在结构体v2f中将float3类型的worldNormal和worldLightDir改为float3的half3如果不需要高精度或在某些平台上使用fixed3但注意范围限制可以减少插值器的负担有时能缓解问题。更根本的解决方法是确保模型法线本身没有问题。Shader不接收阴影或不能投射阴影我们实现的是最基本的光照Pass。要支持阴影需要额外的Pass如ShadowCaster。一个快速的方法是使用Fallback Diffuse或Fallback Standard让Unity在需要时使用内置的Diffuse或Standard Shader中的阴影Pass来兜底。7.2 性能优化技巧谨慎使用normalizenormalize操作涉及开方和除法开销较大。在顶点着色器中如果确定向量来自归一化后的数据如模型法线本身是归一化的且模型变换只包含旋转不含缩放有时可以省略。但在片元着色器中对插值后的向量必须进行归一化。这是质量与性能的权衡不能省。使用半精度变量在移动平台或性能敏感处将float替换为half将float3替换为half3可以显著提升性能。fixed类型精度更低只适用于颜色和0-1之间的值。减少插值器数量从顶点到片元传递的数据越多插值开销越大。思考是否所有数据都是必需的。例如如果不需要纹理就可以去掉uv坐标。7.3 扩展思路迈向更真实的光照掌握了基础的Lambert模型后你可以以此为跳板探索更丰富的光照效果半兰伯特Half LambertValve在《半条命2》中推广的技术。将Lambert系数从[0,1]映射到[0.5,1]公式为halfLambert dot(normal, lightDir) * 0.5 0.5;。这能避免背光面完全死黑让暗部也有细节常用于卡通渲染或风格化表现。高光反射Blinn-Phong在漫反射基础上加入高光项。需要计算视线方向、反射方向或半角向量。这是实现塑料、金属等光滑表面光泽感的下一步。基于图像的光照IBL与环境光遮蔽AO使用立方体贴图Cubemap来模拟复杂的环境光照并结合AO贴图来增强缝隙、角落处的阴影真实感这是实现高质量静态物体的关键。法线贴图Normal Mapping在逐像素光照的框架下用一张纹理来存储每个像素的“法线”信息替换插值得到的顶点法线。这能在不增加模型面数的情况下表现出极其丰富的表面细节如砖墙的缝隙、雕刻的花纹。这是将你的着色器从“玩具”升级到“实用”的必经之路。实现这些扩展的关键都在于你能否理解并熟练运用在本次Lambert实战中学到的核心方法在正确的着色器阶段顶点或片元获取并处理正确的数据法线、光线、视线然后通过恰当的数学公式点积、幂运算等计算出想要的光照分量。当你能够手动实现Lambert时就意味着你已经拿到了打开真实感渲染世界大门的钥匙。

相关新闻

Excel数据分析实战:从数据清洗到可视化呈现的全流程指南

Excel数据分析实战:从数据清洗到可视化呈现的全流程指南

这类 Excel 数据分析教程,最核心的价值不是告诉你功能按钮在哪,而是帮你建立一套从原始数据到分析结论的、可重复的实战流程。很多人学了一堆函数和透视表,真到处理自己手头杂乱的业务数据时,还是不知道从哪下手、步骤是什么、结果…

2026/10/17 8:22:01 阅读更多 →
AI智能体实战:从OpenClaw部署到自定义工具开发全解析

AI智能体实战:从OpenClaw部署到自定义工具开发全解析

1. 从“玩具”到“生产力”:我们为什么需要AI智能体? 最近两年,AI圈的热词从“大模型”悄然转向了“智能体”。如果你还在用ChatGPT、文心一言或者Kimi进行一问一答式的对话,那你可能已经落后了半个身位。真正的变化,发…

2026/10/17 8:28:14 阅读更多 →
北京大兴网站建设公司哪家好?揭秘那些不藏私心的选企指南与避坑真相

北京大兴网站建设公司哪家好?揭秘那些不藏私心的选企指南与避坑真相

在北京大兴这个地方,随着城市发展的脚步越来越快,越来越多的企业主、创业者以及传统行业转型的老板们开始意识到,拥有一个专业的网站已经不再是“锦上添花”,而是“必不可少”的数字名片。特别是当你想要在网上搜一下本地服务,或者展示你的高端制造、特色农业、甚至是一间…

2026/10/19 9:08:54 阅读更多 →

最新新闻

HTTPS加密过程详解:从TLS握手到密钥协商与排障实战

HTTPS加密过程详解:从TLS握手到密钥协商与排障实战

前阵子某公司同事拿了个抓包文件来找我,说某个内部系统的接口访问时好时坏,偶尔卡住十几秒然后报错。我打开抓包软件扫了一眼,发现大量TLS握手中的重传报文,再往下看,原来他压根没把HTTPS加密过程当回事——以为是“握…

2026/10/19 13:01:18 阅读更多 →
Agentic AI落地社会价值:提示工程架构师如何拆解信任与责任难题

Agentic AI落地社会价值:提示工程架构师如何拆解信任与责任难题

Agentic AI的社会价值最近被反复讨论,但真正落到实际业务场景里,落地障碍往往不是模型能力,而是隐藏在提示工程里的一系列细节。作为一个长期和Agent打交道的提示工程架构师,我越来越清楚一件事:我们写的每一段Prompt&…

2026/10/19 13:01:18 阅读更多 →
售货机管理系统设计:设备状态、库存预警与远程指令三重闭环

售货机管理系统设计:设备状态、库存预警与远程指令三重闭环

简介:本资源是一套基于RuoYi框架(SpringBootVue前后端分离)开发的售货机管理系统,面向Java全栈初学者、Web应用开发者及后台管理平台实践者,聚焦智能硬件运营场景中的商品、库存、设备、支付与销售数据等核心管理需求。…

2026/10/19 13:01:18 阅读更多 →
CMSSW离线数据处理框架:从LHC原始数据到物理分析的全链路实践

CMSSW离线数据处理框架:从LHC原始数据到物理分析的全链路实践

简介:CMSSW(Compact Muon Solenoid Software)是CERN大型强子对撞机CMS实验核心的开源离线数据分析框架,面向粒子物理研究人员、高能物理方向研究生及计算科学开发者,用于处理海量探测器数据、执行事件重建、物理对象识…

2026/10/19 13:01:17 阅读更多 →
ROS 2中VS Code无法识别rclcpp?从环境变量到CMake配置全排查

ROS 2中VS Code无法识别rclcpp?从环境变量到CMake配置全排查

前阵子在技术群里看到一位刚转到ROS 2的同行提问&#xff1a;新建的rclcpp项目在VS Code里打开&#xff0c;#include <rclcpp/rclcpp.hpp>这一行直接画了红色波浪线&#xff0c;代码提示完全失灵&#xff0c;尝试编译又报出find_package找不到rclcpp包的错误。这个问题我…

2026/10/19 13:01:17 阅读更多 →
C标准库源码深度剖析:从printf到malloc的底层实现与移植指南

C标准库源码深度剖析:从printf到malloc的底层实现与移植指南

简介&#xff1a;这份资源是C标准库的完整源代码集合&#xff0c;面向希望深入理解C语言底层实现、提升系统级编程能力的开发者与学习者。它涵盖输入输出、字符串处理、内存管理、数学运算、时间日期、文件系统接口等核心模块&#xff0c;适合在阅读源码、优化性能或进行底层开…

2026/10/19 13:00:15 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →