文章目录

  • 一、前言
  • 二、3D模型外描边效果
  • 三、如何制作
  • 三、shader代码

一、前言

有同学问我3D模型的外描边怎么弄,其实网上有很多文章写了实现方式,我就再写个简单的实现和操作流程吧~

二、3D模型外描边效果

三、如何制作

将最下面的shader代码保存为ObjectOutline.shader文件,创建一个material材质球:ObjectOutline.mat
shader拖动到材质球ObjectOutline

给材质球设置贴图和描边,

最后将材质球拖给模型即可

三、shader代码

Shader "Custom/ObjectOutline" {Properties{  _Diffuse("Diffuse", Color) = (1,1,1,1)  _OutlineCol("OutlineCol", Color) = (1,0,0,1)  _OutlineFactor("OutlineFactor", Range(0,1)) = 0.1  _MainTex("Base 2D", 2D) = "white"{}  }//子着色器    SubShader  {  //描边使用两个Pass,第一个pass沿法线挤出一点,只输出描边的颜色  Pass  {  //剔除正面,只渲染背面,对于大多数模型适用,不过如果需要背面的,就有问题了  Cull FrontCGPROGRAM  //使用vert函数和frag函数  #pragma vertex vert  #pragma fragment frag  #include "UnityCG.cginc"  fixed4 _OutlineCol;  float _OutlineFactor;struct v2f  {  float4 pos : SV_POSITION;  }; v2f vert(appdata_full v)  {  v2f o;  //在vertex阶段,每个顶点按照法线的方向偏移一部分,不过这种会造成近大远小的透视问题  //v.vertex.xyz += v.normal * _OutlineFactor;  o.pos = UnityObjectToClipPos(v.vertex); //将法线方向转换到视空间  float3 vnormal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);  //将视空间法线xy坐标转化到投影空间,只有xy需要,z深度不需要了  float2 offset = TransformViewToProjection(vnormal.xy);  //在最终投影阶段输出进行偏移操作  o.pos.xy += offset * _OutlineFactor;  return o;  }fixed4 frag(v2f i) : SV_Target  {  //这个Pass直接输出描边颜色  return _OutlineCol;  }  ENDCG  }//正常着色的Pass  Pass  {  CGPROGRAM     //使用vert函数和frag函数  #pragma vertex vert  #pragma fragment frag  //引入头文件  #include "Lighting.cginc"  //定义Properties中的变量  fixed4 _Diffuse;  sampler2D _MainTex;  //使用了TRANSFROM_TEX宏就需要定义XXX_ST  float4 _MainTex_ST;//定义结构体:vertex shader阶段输出的内容  struct v2f  {   float4 pos : SV_POSITION;  float3 worldNormal : TEXCOORD0;  float2 uv : TEXCOORD1;  };//定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)  v2f vert(appdata_base v)  {  v2f o;  o.pos = UnityObjectToClipPos(v.vertex);  //通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;  o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);  return o;  }//定义片元shader  fixed4 frag(v2f i) : SV_Target  {  //unity自身的diffuse也是带了环境光,这里我们也增加一下环境光  fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;  //归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的  fixed3 worldNormal = normalize(i.worldNormal);  //把光照方向归一化  fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  //根据半兰伯特模型计算像素的光照信息  fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5; //最终输出颜色为lambert光强*材质diffuse颜色*光颜色  fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;  //进行纹理采样  fixed4 color = tex2D(_MainTex, i.uv);  color.rgb = color.rgb* diffuse;  return fixed4(color);  }      ENDCG  }  }  //前面的Shader失效的话,使用默认的Diffuse  FallBack "Diffuse"
}

Unity使用Shader实现3D模型外描边效果相关推荐

  1. Unity使用Shader实现3D模型外描边效果ObjectOutline.shader

    一.前言 有同学问我3D模型的外描边怎么弄,其实网上有很多文章写了实现方式,我就再写个简单的实现和操作流程吧~ 二.3D模型外描边效果 三.如何制作 将最下面的shader代码保存为ObjectOut ...

  2. Unity动态加载3D模型

    Unity动态加载3D模型 在Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中: 第二种是在 Unity 3D 菜单 G ...

  3. [Unity]Shader利用Geometry处理实现描边效果

    1.原理 利用几何着色器,生成新的顶点,用新生成的顶点,构建描边,在用模板测试剔除原模型,如下图 灰色三角形是模型原来的一个三角面,用几何着色器,延顶点法线向外,创建出新的顶点A,B,C.已知一个面的 ...

  4. 详解Unity中的导入3D模型

    前言 三维模型可以表示任何现实世界中存在的物体,自然也可以表示任何游戏世界中存在的物体,比如地面,山川河流,花草树木,建筑,人物,都需要使用三维模型来表示.一般我们使用一些建模软件来建出游戏中需要的模 ...

  5. Unity Render Streaming,3D模型流式云渲染的解决方案

    Unity Render Streaming是Unity开源的一个高质量.高复杂的3D模型在云端渲染,手机端侧.浏览器显示的解决方案.此解决方案的流技术利用了WebRTC,开发人员甚至可以使用WebR ...

  6. Unity HilightingSystem屏幕后实现物体外发光描边效果

    Unity实现物体外发光描边效果方式有好几种,如重叠放大模型描边Pass.卷积核描边.屏幕后处理等. HIightingSytem使用了屏幕后期效果实现,效果如下: 整理出核心代码如下,主要分为4个步 ...

  7. 高德地图:实现3D模型轨迹回放效果(类似百度地图汽车模型路书)

    需求描述 需使用高德地图实现类似百度地图汽车模型路书的效果,即: ①在地图上添加一个沿着路径移动,且角度与路径一致的3D模型: ②3D模型移动过的路径用不同颜色显示出来: 在高德地图在线示例中实现的效 ...

  8. Unity 2D平面显示3D模型(RenderTextrue)

    先创建一个 RawImage 再在文件里创建一个RenderTextrue 在RawImage组件上添加RenderTexture 再创建个Camera(相机)相机对准模型,相机的ClearFlags ...

  9. unity中使用的3D模型类型

最新文章

  1. 理解SSL必须要理解的密码技术
  2. python soup提取叶子标签_python3用BeautifulSoup抓取div标签
  3. 在VS2015中编写x86汇编
  4. 同一个联盟,同一个梦想 —— 微软 .NET 俱乐部 2006 年在线发布会
  5. strom-1.1.0模拟单词统计功能,Spout编写,Bolt编写,TopologyDriver编写,本地模式运行,集群模式运行,集群模式下看输出结果
  6. 主成分分析PCA(principal component analysis)原理
  7. SVM入门(八)松弛变量(转)
  8. hp-ux修改时区方法_UX研究人员可以倡导人类的6种方法
  9. 飞秋 一个程序员的老作品。
  10. go详解strings包
  11. 百度地图在vue中使用
  12. 如何看懂公司的财务报表(2)
  13. zutuanxue.com-Linux终端的使用
  14. 高通携手贵州华芯通:成功源于创新 大数据前景美妙
  15. MySQL学习笔记(九)MVCC
  16. 仪用放大器与报警电路
  17. 浅谈激光的单色性与相干性
  18. 基于winform(C#)的飞鸟小游戏
  19. linux磁盘变为raw,磁盘变成RAW格式的两种解决办法
  20. 《Windows CE嵌入式开发入门——基于Xscale架构》第4章 外设控制器

热门文章

  1. 伪原创视频改多少比例 短视频去水印小工具bet
  2. JS添加获取Cookie
  3. 联想Y7000P重装Ubuntu16.04.7系列教程(Nvidia GeForce RTX 2060/driver Version 460.67/CUDA11.2/CUDNN8.1.1)
  4. 获取 Class 对象的 3 种方法
  5. 在「星图地球开发者平台」怎么使用表格组件?(附视频教程)
  6. 颈椎病康复指南-程序员专用
  7. Flink Sql双流join-回撤机制导致数据重复
  8. python 决策树回归参数_使用 Python 和 scikit-learn 学习回归算法
  9. MySQL常用时间函数
  10. c语言 until,for,while,until