Unity Shader 广告牌效果
广告牌效果指的是,一个二维平面的法线方向始终与视线(摄像机的观察方向)相同。广泛运用于渲染烟雾,云朵,闪光等。
它的本质在于构建旋转矩阵,此时我们可以选择三个基向量来构建此矩阵。
指向→的方向(X轴)
指向↑的方向(Y轴)
平面的法线方向(Z轴)
计算方法通常是:
1.根据当前摄像机的方向确定法线方向(广告牌效果的本质),并归一化
normal=normalize(viewDir);
2.根据得到的法线方向和初始的向上方向(在本地空间中即为float3(0,1,0))计算向右的方向,并归一化
right=normalize(cross(up,normal));(使用向量的叉乘计算)
3.用计算后的向右方向和法线方向重新校正向上的方向,得到精确值
up'=normalize(cross(right,normal));
计算出旋转矩阵后对原始的顶点进行各自方向上的偏移
脚本如下:
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' Shader "MyUnlit/Billboarding"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color("Color Tint",color)=(,,,)
}
SubShader
{
//对顶点进行变换需禁用合P
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true" "DisableBatching" = "True" } Pass
{
//透明度混合
Tags{ "lightmode" = "forwardbase" }
ZWrite off
Blend SrcAlpha OneMinusSrcAlpha
Cull off CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS()
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color; v2f vert (appdata v)
{
v2f o;
//计算模型空间中的视线方向
float3 objViewDir = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, )); //计算旋转矩阵的各个基向量
float3 normalDir =normalize(objViewDir);
float3 upDir =float3(, , );
float3 rightDir = normalize(cross(normalDir, upDir));
upDir = normalize(cross(normalDir, rightDir)); //用旋转矩阵对顶点进行偏移
float3 localPos =rightDir * v.vertex.x + upDir * v.vertex.y + normalDir * v.vertex.z; //将偏移之后的值作为新的顶点传递计算
o.vertex = UnityObjectToClipPos(float4(localPos,));
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
col.rgb *= _Color.rgb;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
fallback "Transparent/VertexLit"
}
Unity Shader 广告牌效果的更多相关文章
- Unity Shader - 消融效果原理与变体
基本原理与实现 主要使用噪声和透明度测试,从噪声图中读取某个通道的值,然后使用该值进行透明度测试. 主要代码如下: fixed cutout = tex2D(_NoiseTex, i.uvNoiseT ...
- Unity Shader 景深效果
效果 原理: 开启摄像机的深度模式,将深度保存到一张名为_CameraDepthTexture(Unity5.0之后才有)内置的纹理中. 如果深度在焦点范围内就用原图,否则就用模糊图. Shader: ...
- Unity Shader 玻璃效果
一个玻璃效果主要分为两个部分,一部分是折射效果的计算,另一部分则是反射.下面分类进行讨论: 折射: 1.利用Grass Pass对当前屏幕的渲染图像进行采样 2.得到法线贴图对折射的影响 3.对采集的 ...
- 小强学渲染之Unity Shader噪声应用
之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...
- Unity3D学习(八):《Unity Shader入门精要》——透明效果
前言 在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道. Unity中通常使用两种方法来实现透明 :(1)透明度测试(AlphaTest)(2)透明度混合(AlphaBlend).前者往 ...
- Unity shader学习之屏幕后期处理效果之高斯模糊
高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...
- 【Unity Shader】(五) ------ 透明效果之半透明效果的实现及原理
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题 [Unity Shader学习笔记](三) -- ...
- 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- Unity Shader 之 透明效果
透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...
随机推荐
- 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
序 学生时期,有过小组作业,当时分工一人做那么两三个页面,然而在前端差不多的时候,我和另一个同学发生了争执.当时用的是简单的三层架构(DLL.BLL.UI),我个人觉得各写各的吧,到时候合并,而他觉得 ...
- qt 界面去掉系统边框2.0版
之前的一版存在bug.如果将鼠标放移动到界面内某个可点击的widget上(如:QPushButton)上,按住鼠标左键不放,界面可能会出现界面非预期移动的问题. 那是因为当鼠标移动到可点击的widge ...
- JPA使用Specification构建动态查询
封装Specification查询条件,在Spring Data JPA 2.0以前使用 Specifications 这个辅助类来操作where.not.and和or连接,在2.0版本以后这个类会被 ...
- ios 点击webview获取图片url (js交互)
加手势 -(void)handleSingleTap:(UITapGestureRecognizer *)sender { CGPoint pt = [sender locationInView:_c ...
- MySQL循环日期
DROP PROCEDURE IF EXISTS `insertManyDate`$$ CREATE DEFINER=`root`@`%` PROCEDURE `insertManyDate`(IN ...
- 简单使用:SpringBoot整合Redis
1.导入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- spring boot jsp里面的静态资源访问不到解决办法
闲着没事写的小Demo 用到了jsp页面,里面有些静态资源, springboot 默认的静态资源的值有四个:Default: classpath:/META-INF/resources/,class ...
- jmeter插件
https://jmeter-plugins.org/install/Install/ plugins-manager.jar放到 lib/ext中,重启可以发现JMeter Plugins Mana ...
- 201871010105-曹玉中《面向对象程序设计(java)》第七周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- 唐敬博-201871010118 《面向对象程序设计(java)》第六、七周学习总结
在博客园撰写博客(随笔),总结6-7周学习内容(包括实验内容),作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第四周学习总结(1分) 博文正文开头格式:(2分) ...