当前位置: 首页 > article >正文

Unity CG着色器实战

卡通风格先一个Pass只渲染背面黑色沿法线膨胀做轮廓线效果正式渲染Pass漫反射采样一个逐渐变暗的纹理做出硬边明暗。高光反射和一个阈值比较大于则直接显示高光颜色。Shader My/Toon { Properties { _Color (Color, Color) (1,1,1,1) _SpeColor(SpeColor,Color)(1,1,1,1) _SpecThreshold(SpecThreshold,Range(0.1,1))1 _MainTex(MainTex,2D)white{} _ShadeTex(ShadeTex,2D)white{} _OutlineWidth(OutlineWidth,Range(0.001,0.1))0.01 _OutlineCol(OutlineColor,Color)(0,0,0,1) [Enum(UnityEngine.Rendering.CullMode)]_Cull(Cull,Float)0 } SubShader { Tags { RenderTypeTransparentCutoutQueueAlphaTest} LOD 100 Pass{ Name Outline Cull Front CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc struct v2f { float4 vertex: SV_POSITION; }; float _OutlineWidth; fixed4 _OutlineCol; v2f vert(appdata_base v){ v2f o; v.vertex.xyz normalize(v.normal)* _OutlineWidth; o.vertex UnityObjectToClipPos(v.vertex); return o; } fixed4 frag(v2f i): SV_Target{ return _OutlineCol; } ENDCG } Pass { Name Main Tags{LightMode ForwardBase} Cull [_Cull] Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase #include UnityCG.cginc #include Lighting.cginc #include AutoLight.cginc struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv:TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float2 uv:TEXCOORD0; float3 worldPos: TEXCOORD1; float3 worldNormal: TEXCOORD2; float3 viewDir: TEXCOORD3; float3 lightDir: TEXCOORD4; SHADOW_COORDS(5) }; fixed4 _Color; fixed4 _SpeColor; float _SpecThreshold; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _ShadeTex; v2f vert (appdata v) { v2f o; o.pos UnityObjectToClipPos(v.vertex); o.worldNormalnormalize(UnityObjectToWorldNormal(v.normal)); o.lightDir-normalize(_WorldSpaceLightPos0.xyz); o.worldPosmul(unity_ObjectToWorld,v.vertex); o.viewDirnormalize(_WorldSpaceCameraPos-o.worldPos); TRANSFER_SHADOW(o); o.uvv.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 texColtex2D(_MainTex,i.uv); //漫反射 float3 lightPosnormalize(_WorldSpaceLightPos0.xyz); fixed diffdot(i.worldNormal,lightPos)*0.50.5; UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos); diff*atten; fixed4 shadeColtex2D(_ShadeTex,float2(diff,0)); //高光 float3 reflDirreflect(i.lightDir,i.worldNormal); float specstep(_SpecThreshold ,dot(reflDir,i.viewDir)); fixed3 color_Color.rgb* texCol.rgb*(UNITY_LIGHTMODEL_AMBIENT shadeCol) _SpeColor.rgb* spec; return fixed4(color,texCol.a); //return UNITY_LIGHTMODEL_AMBIENT; } ENDCG } } Fallback Diffuse }脸的下部有点黑可以加一个漫反射明暗到渐变贴图u的系数控制漫反射变黑的阈值。消融效果Shader My/Melt { Properties { _MainTex (Texture, 2D) white {} _NoiseTex(NoiseTex,2D){} _EdgeTex(EdgeTex,2D){} _EdgeWidth(EdgeWidth,Range(0,1))0.01 _MeltThre(MeltThreshold,Range(0,1))0 } SubShader { Tags { RenderTypeOpaque } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _NoiseTex; sampler2D _EdgeTex; fixed _EdgeWidth; fixed _MeltThre; v2f vert (appdata_base v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv TRANSFORM_TEX(v.texcoord, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed no tex2D(_NoiseTex,i.uv); clip(no- _MeltThre); //噪声离阈值的差小于edge宽度时开始显示边缘 //把差值相对于edge宽度的比例转换到0-1用于采样贴图 fixed edgeU1- smoothstep(0,_EdgeWidth,no- _MeltThre); fixed4 edgeCol tex2D(_EdgeTex,fixed2(edgeU,0.5)); fixed4 col tex2D(_MainTex, i.uv); return lerp(col, edgeCol,edgeU); } ENDCG } } }水面Shader My/Water { Properties{ _MainTex(MainTex,2D){} _NormalTex(NormalTex,2D){} _Cube(Cubemap,Cube){} _Distortion(Distortion,Range(0,1))0 _XSpeed(XSpeed,Range(-0.1,0.1))0.01 _YSpeed(YSpeed,Range(-0.1,0.1))0.01 _Fresnel(Fresnel,Range(0,1))1 } SubShader{ Tags{RenderTypeOpaqueQueueTransparent} GrabPass{} Pass{ Tags{LightModeForwardBase} CGPROGRAM #pragma vertex vert #pragma fragment frag #include UnityCG.cginc #include Lighting.cginc sampler2D _MainTex; float4 _MainTex_ST; sampler2D _NormalTex; float4 _NormalTex_ST; samplerCUBE _Cube; sampler2D _GrabTexture;//GrabPass捕获的图像默认名 float _Distortion; fixed _XSpeed; fixed _YSpeed; float _Fresnel; struct v2f { float4 pos:SV_POSITION; float4 grabPos:TEXCOORD0; float4 uv:TEXCOORD1; float4 TtoW0: TEXCOORD3; float4 TtoW1: TEXCOORD4; float4 TtoW2: TEXCOORD5; }; v2f vert(appdata_full v){ v2f o; o.pos UnityObjectToClipPos(v.vertex); o.grabPos ComputeScreenPos(o.pos); o.uv.xyv.texcoord.xy* _MainTex_ST.xy _MainTex_ST.zw; o.uv.zwv.texcoord.xy* _NormalTex_ST.xy _NormalTex_ST.zw; float3 worldNormal UnityObjectToWorldNormal(v.normal); fixed3 worldPosmul(unity_ObjectToWorld,v.vertex).xyz; // float3 worldTan UnityObjectToWorldDir(v.tangent); float3 worldBinormal cross(normalize(worldTan),normalize(worldNormal))*v.tangent.w; o.TtoW0float4(worldTan.x,worldBinormal.x,worldNormal.x,worldPos.x); o.TtoW1float4(worldTan.y,worldBinormal.y,worldNormal.y,worldPos.y); o.TtoW2float4(worldTan.z,worldBinormal.z,worldNormal.z,worldPos.z); return o; } fixed4 frag(v2f i):SV_Target{ float3 worldPosfloat3(i.TtoW0.w,i.TtoW1.w,i.TtoW2.w); fixed3 viewDir normalize(UnityWorldSpaceViewDir(worldPos)); //float4 normal tex2D(_NormalTex,i.uv.zw); ////法线贴图的法线在切线空间 //float3 tanNormalUnpackNormal(normal); float2 speed _Time.y*float2( _XSpeed,_YSpeed); float4 packNormal tex2D(_NormalTex,i.uv.zw speed); fixed3 bump1 UnpackNormal(packNormal).rgb; packNormal tex2D(_NormalTex,i.uv.zw- speed); fixed3 bump2 UnpackNormal(packNormal).rgb; fixed3 bump normalize( bump1bump2); ////法线贴图的法线在世界 float3 worldNormal float3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)); fixed3 albedo tex2D(_MainTex, i.uv.xy); float3 refl reflect(-viewDir,worldNormal); //兰伯特 //fixed3 lambertColor _LightColor0.rgb * albedo.rgb * max(0, dot(worldNormal, normalize(_WorldSpaceLightPos0.xyz))); //半角向量 //float3 halfA normalize(normalize(viewDir) normalize(_WorldSpaceLightPos0.xyz)); //高光反射 //fixed3 specularColor _LightColor0.rgb* pow(max(0, dot(worldNormal, halfA)), _SpecularNum); fixed4 reflCol texCUBE(_Cube,refl)*tex2D(_MainTex,i.uv); float2 offset bump.xy*_Distortion; i.grabPos.xy offset*i.grabPos.z i.grabPos.xy; fixed2 screenUV(i.grabPos.xyoffset)/i.grabPos.w; fixed4 grabCol tex2D(_GrabTexture,screenUV); fixed fresnel _Fresnel(1- _Fresnel)* pow((1-dot(normalize(viewDir),normalize(worldNormal))),5); float4 colorreflCol*(1-fresnel)grabCol*fresnel; return color; } ENDCG } } }

相关文章:

Unity CG着色器实战

卡通风格先一个Pass只渲染背面,黑色,沿法线膨胀,做轮廓线效果;正式渲染Pass,漫反射采样一个逐渐变暗的纹理,做出硬边明暗。高光反射和一个阈值比较,大于则直接显示高光颜色。Shader "My/To…...

直接上结论:10个AI论文网站测评!本科生毕业论文写作必备工具推荐

在当前学术写作日益依赖AI工具的背景下,本科生在毕业论文写作过程中常常面临选题困难、文献检索繁琐、内容逻辑不清、格式规范不熟等多重挑战。为了帮助学生高效完成高质量论文,笔者基于2026年的实测数据与真实用户反馈,对市面上主流的10个AI…...

综述不会写?10个AI论文工具测评:本科生毕业论文写作与科研写作必备神器

在当前学术写作日益数字化的背景下,越来越多的学生和研究者开始依赖AI工具提升写作效率与质量。然而,面对市场上种类繁多的论文辅助工具,如何选择真正适合自己的产品成为一大难题。为此,我们基于2026年的实测数据与用户反馈&#…...

认知引力统一场论:从物理定律到认知现象的通用智能基础

认知引力统一场论:从物理定律到认知现象的通用智能基础Cognitive Unified Field Theory: From Physical Laws to Cognitive Phenomena as the Foundation of General Intelligence摘要本文提出认知引力统一场论(CUFT),UCFT与认知三论的认知架构深度融合&…...

全网最全 10个AI论文平台:开源免费测评,开题报告与毕业论文写作必备工具推荐

在当前学术研究日益数字化的背景下,AI写作工具已成为高校师生和科研人员不可或缺的辅助工具。然而,面对市场上种类繁多的平台,如何选择真正高效、实用且符合个人需求的工具,成为一大难题。为此,我们基于2026年的实际测…...

【模板】多重背包【牛客tracker 每日一题】

【模板】多重背包 时间限制:5秒 空间限制:256M 网页链接 牛客tracker 牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力…...

windows常用脚本

安装uv powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.sh | iex"...

AI Agent时代,记忆才是真正的“进化引擎”【科普指南】

最近看到论文来自牛津、南洋理工、北大、复旦、Georgia Tech等顶级机构,40多位研究员联手写了一篇叫《Memory in the Age of AI Agents》的调研报告(arXiv 2512.13564)。核心结论很狠:99%的Agent架构其实从根上就错了,…...

改稿速度拉满 10个降AIGC软件全场景通用测评:哪个能帮你高效降AI率?

在学术写作和论文撰写过程中,AI生成内容的痕迹往往成为查重率居高不下的关键因素。随着AIGC技术的普及,越来越多的作者开始关注如何有效降低AI痕迹、提升论文的原创性与可读性。AI降重工具应运而生,它们不仅能够精准识别并修改AI生成内容&…...

新手也能上手!冠绝行业的AI论文写作软件 —— 千笔·专业论文写作工具

你是否曾在论文写作中感到无从下手?选题纠结、框架混乱、文献检索困难、查重率高得让人焦虑……这些困扰,是否让你夜不能寐?面对繁杂的学术任务,很多同学都感到力不从心。而如今,一款专为学生打造的AI论文写作工具——…...

对比一圈后! 降AIGC软件 千笔·专业降AI率智能体 VS 云笔AI 专科生首选

在AI技术迅速发展的今天,越来越多的学生开始借助AI工具辅助论文写作,以提升效率和内容质量。然而,随着各大查重系统对AI生成内容的识别能力不断提升,"AI率超标"问题逐渐成为学术写作中的一大难题。无论是知网、维普还是…...

(leetcode)力扣100 96.只出现一次的数字(位运算)

题解给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 数据范围1 < nums.length < …...

永磁同步电机与无刷直流电机 FOC 过调制算法的探索与实践

永磁同步电机 无刷直流电机FOC过调制算法&#xff0c;共5种&#xff0c;并且含有6种DPWM控制&#xff0c;包含经典FOC电流环&#xff0c;经典SVPWM,简易SVPWM,弱磁&#xff0c;前馈解耦&#xff0c;5种过调制算法各有特点&#xff0c;全部提取工程实践&#xff0c;全部在项目中…...

计算机毕业设计源码:Python旅游大数据智能可视化看板 Flask框架 可视化 旅游 出行 出游 大数据 大模型 数据分析 agent(建议收藏)✅

1、项目介绍 技术栈 Python语言、Flask框架、Echarts可视化工具、HTML前端技术&#xff0c;用于旅游数据的可视化呈现与分析。 功能模块旅游大数据大屏旅游板块分析——游客旅游板块分析——商家旅游舆情分析 项目介绍 旅游大数据分析可视化系统基于Python Flask框架构…...

什么是Spring Boot 应用开发?

一、引言 在当今的软件开发领域&#xff0c;Java 依然占据着重要的地位&#xff0c;而 Spring Boot 作为 Java 生态系统中极具影响力的框架&#xff0c;极大地简化了企业级应用的开发流程&#xff0c;提升了开发效率和应用的可维护性。它基于 Spring 框架构建&#xff0c;通过约…...

核心框架源码常见问题(下)

1、BeanFactory跟FactoryBean的区别&#xff08;常识&#xff09;在Spring框架中&#xff0c;BeanFactory和FactoryBean就不是一个东西&#xff0c;名字看着像一点。首先这哥俩都是接口。其中BeanFactory其实就是咱们一直在说的Spring容器&#xff0c;Spring工厂&#xff0c;IO…...

Java 池化技术

Java中的池化技术&#xff0c;这是一种通过重用对象来提升性能的重要技术。1. 什么是池化技术池化技术的核心思想是&#xff1a;将资源预先创建好&#xff0c;放在一个"池子"里&#xff0c;需要时从池中获取&#xff0c;用完后归还&#xff0c;而不是每次都创建新的。…...

视频批量加封面软件|智能截取指定时间帧生成封面,离线可用一键适配多平台

温馨提示&#xff1a;文末有联系方式【核心功能&#xff1a;智能批量封面生成】 本工具专为内容创作者与运营人员设计&#xff0c;可对多个视频文件进行统一化封面处理。 无需逐个打开编辑&#xff0c;只需设定目标时间点&#xff08;如3秒、5秒或片头黄金帧&#xff09;&#…...

多平台智能邮件群发工具|Python底层开发|支持变量模板、附件批量发送与失败邮箱自动记录

温馨提示&#xff1a;文末有联系方式产品核心功能概览 本工具是一款专为高效邮件分发设计的智能解决方案&#xff0c;突破单一邮箱限制&#xff0c;全面兼容主流邮件平台&#xff08;包括但不限于QQ邮箱、163邮箱、Gmail、Outlook、Yahoo等&#xff09;作为发信源&#xff0c;可…...

Memtest86中文版内存诊断工具|U盘启动DDR2-DDR5全兼容|军工级精准检测蓝屏死机根源

温馨提示&#xff1a;文末有联系方式一、什么是Memtest86中文版内存诊断工具 Memtest86中文版是一款专为硬件工程师、IT运维人员及DIY爱好者打造的高可靠性内存检测解决方案。 它基于国际公认权威内核&#xff0c;完整汉化界面&#xff0c;支持U盘免安装一键启动&#xff0c;无…...

Golang实现企业级AI智能体安全合规自动化检测系统

摘要:随着欧盟AI法案(EU AI Act)2026年3月实施细则正式生效,以及中国《网络安全法》修订版新增AI安全专项条款,企业部署AI智能体面临前所未有的合规压力。本文基于Golang构建企业级AI智能体安全合规自动化检测系统,实现法规条款智能解析、智能体行为实时监控、多维度风险…...

面试官与水货程序员谢飞机的面试奇遇记

面试官与水货程序员谢飞机的面试奇遇记 第一轮&#xff1a;基础入门 面试官&#xff1a;"谢飞机同学你好&#xff0c;请先简单介绍一下自己吧。" 谢飞机&#xff1a;"呃...面试官你好&#xff0c;我叫谢飞机&#xff0c;从事Java开发三年多了&#xff0c;做过一…...

互联网大厂Java面试现场:严肃面试官与搞笑程序员谢飞机的爆笑对决

互联网大厂Java面试现场&#xff1a;面试官与水货程序员谢飞机的爆笑对决人物介绍 面试官&#xff1a;某互联网大厂技术总监&#xff0c;提问风格严谨&#xff0c;喜欢循序渐进引导 谢飞机&#xff1a;三年CRUD经验的水货程序员&#xff0c;简历吹上天&#xff0c;面试全靠编第…...

【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展

背景 语义分割是将图像中的每个像素按其语义类别进行分类&#xff0c;从而实现像素级别的语义理解。其在自动驾驶、医学图像、结构损伤检测等领域有着广泛的应用。 1.主流算法架构 1.1 U-Net 论文地址&#xff1a;https://arxiv.org/abs/1505.04597 U-Net2015年由Ronneberge…...

Python-flask基于安卓的的酒店管理系统 小程序

目录技术栈选择功能模块设计后端实现要点小程序前端开发接口安全与性能测试与部署时间规划注意事项项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术栈选择 后端采用Python Flask框架&#xff0c;轻…...

Python-flask向家租房 房屋租赁微信小程序t9353

目录需求分析技术栈选型数据库设计API接口开发微信小程序集成测试与部署安全与性能优化迭代计划项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析 明确房屋租赁微信小程序的核心功能需求&#…...

最新真空泵配备专利吹扫注入系统

普发真空Fab解决方案&#xff08;Pfeiffer VacuumFab Solutions&#xff0c;隶属于 Busch 集团&#xff09;&#xff0c;已推出 UltiDry 多级罗茨真空泵。这款新泵专为要求严苛的半导体应用而设计&#xff0c;旨在抵御腐蚀性气体、具有侵蚀性的副产物以及大量的粉末负载。其无油…...

【开题答辩全过程】以 基于Springboot的养老服务管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

【开题答辩全过程】以 基于微信平台的电子阅读器为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

好物分享 | gstack:将 Claude Code 从通用助手升级为专属专家团队

在日常软件开发过程中&#xff0c;我们常常陷入一种与 AI 编程助手博弈的困境。当你向通用型 AI 代理提出一个需求时&#xff0c;它往往会字面意义上地执行你的指令&#xff0c;却忽略了背后的产品目标。你让它修复一个 bug&#xff0c;它可能只修复了表面现象而忽略了架构隐患…...