描边shader(法线外拓)
描边的思路是需要两个pass。第一个pass让顶点沿着法线方向延伸出去,使得模型变大一圈。第二个pass正常渲染,让正常渲染的模型挡在第一个pass之上,这样就会露出延伸出去的部分,延伸出去的就是我们要的描边了。代码实现如下:
Shader "Custom/PjOutlineTest" {
Properties {
_Color ("Color", Color) = (,,,)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_OutlineWidth("OutlineWidth",Range(,))=0.01
_Diffuse("Diffuse",Color)=(,,,)
}
SubShader {
//第一个pass沿着法线“膨胀”一点,并且剔除正面
pass{
Cull FRONT
Offset ,
CGPROGRAM
#include "UnityCG.cginc"
float4 _Color;
float _OutlineWidth;
#pragma vertex vert
#pragma fragment frag
struct v2f{
float4 pos:POSITION;
float4 color:COLOR;
};
v2f vert(appdata_full v){
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
//法向量转换到view坐标
float3 vNormal=mul((float3x3)UNITY_MATRIX_MV,v.normal);
//转换到投影面只需要x和y方向
float2 offsetDir=TransformViewToProjection(vNormal.xy);
//顶点坐标沿着法向量偏移“宽度值”
o.pos.xy+=offsetDir*_OutlineWidth;
o.color=_Color;
return o;
}
float4 frag (v2f i) : COLOR
{
return i.color;
}
ENDCG
}
//正常渲染
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
//引入头文件
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
sampler2D _MainTex;
//使用了TRANSFROM_TEX宏就需要定义XXX_ST
float4 _MainTex_ST;
struct v2f
{
float4 pos : SV_POSITION;
float lambert : TEXCOORD0;
float2 uv : TEXCOORD1;
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
float3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object));
float3 worldPos = mul(_Object2World, o.pos);
float3 worldLightDir =normalize(_WorldSpaceLightPos0.xyz);
o.lambert = dot(worldNormal, worldLightDir) ;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 diffuse = i.lambert * _Diffuse.xyz * _LightColor0.xyz ;
fixed4 color = tex2D(_MainTex, i.uv);
color.rgb = color.rgb* diffuse;
return fixed4(color);
}
ENDCG
}
}
FallBack "Diffuse"
}
效果如下:

法线外拓有些缺陷,在棱角分明的模型中表现较差,锐利的部分,描边会有断裂。
描边shader(法线外拓)的更多相关文章
- 小强学渲染之Unity Shader边缘描边加强
项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...
- Unity Shader实现描边效果
http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...
- unity描边效果
这里总结了几种在unity实现描边效果的方法,首先准备一个模型导入在unity中,使用默认shader,上传一张原始图,以便后面实现功能效果的对比 一.边缘光,这里参照官方的一个SurfaceShad ...
- Unity——卡通渲染实现
效果展示: 原模型: 一.简单分析 卡通渲染又叫非真实渲染(None-Physical Rendering-NPR),一般日漫里的卡通风格有几个特点: 1.人物有描边 2.有明显的阴影分界线,没有太平 ...
- 基于Shader实现的UGUI描边解决方案
基于Shader实现的UGUI描边解决方案 前言 大扎好,我系狗猥.当大家都以为我鸽了的时候,我又出现了,这也是一种鸽.创业两年失败后归来,今天想给大家分享一个我最近研究出来的好康的,比游戏还刺激,还 ...
- Cocos2d-x shader学习3: sprite描边(Outline)
Cocos2d-x 3.x的label使用了freetype字体引擎(http://www.freetype.org/),可以很轻松的实现描边和阴影效果.所以本篇文章只针对于sprite来实现描边效果 ...
- Unity3d shader之卡通着色Toon Shading
卡通着色的目的是为了让被着色物体显得过渡的不那么好,明暗交界线很明显,等等卡通风格的一系列特征, 也叫Non-photorealisticrendering非真实渲染 重点要做到两点: 1. 描 ...
- Unity shader 官网文档全方位学习(一)
转载:https://my.oschina.net/u/138823/blog/181131 摘要: 这篇文章主要介绍Surface Shaders基础及Examples详尽解析 What?? Sha ...
- Unity3d游戏角色描边
本文发布于游戏程序员刘宇的个人博客,欢迎转载,请注明来源https://www.cnblogs.com/xiaohutu/p/10834491.html 游戏里经常需要在角色上做描边,这里总结一下平时 ...
随机推荐
- javascript总结37:DOM:innerText 和 innerHTML
innerText 和 innerHTML 作用: 给双标签的元素设置内容/获取双标签里面的内容 不同点: innerText 只是用于获取文本或设置文本 innerHTML 不仅可以用于设置/获取文 ...
- js流程图:aworkflow.js
auto-workflow 用于快速构建各种关系图的库 github地址:https://github.com/auto-workflow/AWorkflow 快速开始 npm install awo ...
- Activity Fragment转场动画
Activity转场动画 先介绍个动画的好例子:https://github.com/lgvalle/Material-Animations Activity的转场动画是通过overridePendi ...
- mysql转ElasticSearch的分析 及JAVA API 初探
前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...
- IT技术公众号推荐
获取二维码方法:http://open.weixin.qq.com/qr/code/?username=公众账号,例如:cjscwe_2015 目录 全栈 编程语言 前端开发 移动开发 数据库 操 ...
- linux 常见命令--系统信息部分
head -n 1 /etc/issue #查看操作系统 cat /etc/redhat-release #查看linux系统版本 cat /proc/meminfo |grep MemTot ...
- [Windows] IIS6 部署ISAPI
环境: OS:Windows Server 2003 Enterprise sp2 34位 IIS:6.0 ISAPI: delphi xe 编译的webbroker isapi dll 32位 ( ...
- C# 字符,字符串和文本处理。
1. 字符: 在.net中 字符是表示成16为Unicode代码值.每个字符都是System.Char结构(一个值类型)的实例. public class StringTempte { public ...
- Java Integer为代表的包装类
Java种的Integer是int的包装类型 1. Integer 是int的包装类型,数据类型是类,初值为null 2. 初始化时 int i = 1; Integer i = new Intege ...
- 《html5 从入门到精通》读书笔记(三)
二.标签详解 标签 描述 4 5 <form> 定义表单. 4 5 <h1> to <h6> 定义标题1到标题6. 4 5 <head> 定义关于文档的 ...