主角场景Shader效果:描边
基本思路:Shader用两个Pass,一个渲染描边部分,一个渲染物体部分。
Pass1:剔除正面,渲染背面,把顶点延法线方向外围扩展一定宽度,用来表现描边的粗细,这部分用自己设定的颜色。
Pass2:剔除背面,渲染正面,正常渲染所看到的物体模型。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'mul(UNITY_MATRIX_MVP,*)'
Shader "xj/ModelEffect/Outline" {
Properties {
_Color ("模型颜色", Color) = (,,,)
_OutlineColor ("描边颜色", Color) = (,,,)
_Outline ("描边宽度", float) = 0.03
_MainTex ("模型贴图", 2D) = "white" {}
_AlphaTex ("Alpha (A)", 2D) = "white" {}
_intensity ("强度", float ) = 1.0
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
half2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};
struct basevt {
float4 pos : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
sampler2D _AlphaTex;
uniform fixed _Outline;
uniform fixed4 _OutlineColor;
uniform fixed4 _Color;
fixed _intensity;
v2f outline_vert(appdata v)
{
//在vertex阶段,每个顶点按照法线的方向偏移一部分,不过这种会造成近大远小的透视问题
//正确的做法是转换到投影空间下做偏移
//v.vertex.xyz += v.normal * _Outline;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
float2 offset = TransformViewToProjection(norm.xy);
o.pos.xy += offset * _Outline;
o.color = _OutlineColor;
o.texcoord = v.texcoord;
return o;
}
fixed4 outline_frag(v2f i): SV_Target
{
fixed4 color = i.color;
color.a = tex2D(_AlphaTex, i.texcoord).a;
return color;
}
basevt base_vert(appdata v)
{
basevt o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.texcoord = v.texcoord;
return o;
}
fixed4 base_frag(basevt i): SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord) * _Color * _intensity;
col.a = tex2D(_AlphaTex, i.texcoord).a * _Color.a;
return col;
}
ENDCG
SubShader {
Tags { "Queue" = "Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Fog {Mode Off}
Pass
{
Name "OUTLINE"
Cull Front //剔除正面
CGPROGRAM
#pragma vertex outline_vert
#pragma fragment outline_frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
Pass
{
Name "BASE"
Cull Back //剔除背面
CGPROGRAM
#pragma vertex base_vert
#pragma fragment base_frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
FallBack "xj/Default"
}
主角场景Shader效果:描边的更多相关文章
- 主角场景Shader效果:遮挡透明
基本原理:被遮挡的部分关闭深度写入, 显示透明效果:未被遮挡的部分不关闭深度测试,显示正常贴图效果,即使用两个Pass即可. Pass1:关闭深度写入(ZWrite Off),深度测试渲染较远的物体, ...
- 主角场景Shader效果:光影
基本思路:unity有一种很容易实现光影效果的神器,那就是unity自带的projector. 首先需要用到两张贴图: 一张投影需要的光圈贴图,如下: 一张根据远近距离显示暗淡的贴图(左至右,白渐变黑 ...
- Unity Shader实现描边效果
http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...
- 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画
1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...
- Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题
这个问题,主要还是在移动平台下开发导致的. 在编辑器里调试加载AB时会导致Shader效果不正确的原因,主要还是编辑器下加载以IOS或是ANDROID平台打包的AB它所使用的shader已经编译成对应 ...
- 小强学渲染之Unity Shader边缘描边加强
项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...
- Unity3D 屏幕空间雪场景Shader渲染
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- 灵感闪现 篇 (一) 2d场景 3d 效果
中途打断一下 ,框架文档的 更新. 另开一篇主题为 灵感闪现的 板块. 在工作生活中,总有发现新事物或新东西 而让自己突然 灵感闪现的时候,那么这个时候,我必须要抓住,并尽快把 这份灵感实现下来. 之 ...
- Unity Shader 效果(1) :图片流光效果
很多游戏Logo中可以看到这种流光效果,一般的实现方案就是对带有光条的图片uv根据时间进行移动,然后和原图就行叠加实现,不过实现过程中稍稍有点需要注意的地方.之前考虑过风宇冲的实现方式,但是考虑到sh ...
随机推荐
- tomcat安装及使用详解
常用软件安装及使用目录 资料链接:https://pan.baidu.com/s/1XOUlneFqt-_1tOLSmc-E1g 网盘分享的文件在此 1. Tomcat简介 Tomcat是一个 ...
- Python发送邮件(最全)
简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件. Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听 ...
- PowerDesgner的视图显示设置教程
一.简介 PowerDesgner是一款实用的数据库原型设计软件,但一些新手往往会觉得不好上手,应小伙伴需要,整理了一下PowerDesgner的视图显示设置教程: 首先,PowerDesgner的数 ...
- Task2 四则运算2
1.任务要求:对之前的自动出题系统提出了新的要求:(1).题目避免重复:(2).可定制(数量/打印方式):(3)可以控制下列参数:是否有乘除法.数值范围.加减有无负数.除法有无余数.是否支持分数... ...
- 《Spring2之站立会议5》
<Spring2之站立会议5> 昨天,接着对主界面进行代码的编写,实现了界面的美化,从图片库中调了一些图片对其进行优化: 今天,向主界面中加入语音功能部分的代码: 遇到的问题:发现虽然是调 ...
- 关于react虚拟DOM的研究
1.传统的前端是这样的,我在学校也都是这样做的,html(jsp)主要负责提供所有的DOM节点,而javascript负责动态效果,比如按钮点击,图片轮播等,这样的话javascript如何组织结构是 ...
- eg_5
问题描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符. 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” ...
- 深入理解JAVA I/O系列一:File
I/O简介 I/O问题可以说是当今web应用中所面临的的主要问题之一,大部分的web应用系统的瓶颈都是I/O瓶颈.这个系列主要介绍JAVA的I/O类库基本架构.磁盘I/O工作机制.网络I/O工作机制以 ...
- sprint1
6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...
- 我所理解的Delphi中的数组类型
数组可以使Object Pascal所拥有的任何数据类型,数组是一些数值的简单集合. var MyArray: ..] of Integer; { 声明一个数组包括5个整数数值} b ...