广告牌效果指的是,一个二维平面的法线方向始终与视线(摄像机的观察方向)相同。广泛运用于渲染烟雾,云朵,闪光等。

它的本质在于构建旋转矩阵,此时我们可以选择三个基向量来构建此矩阵。

指向→的方向(X轴)

指向↑的方向(Y轴)

平面的法线方向(Z轴)

计算方法通常是:

1.根据当前摄像机的方向确定法线方向(广告牌效果的本质),并归一化

normal=normalize(viewDir);

2.根据得到的法线方向和初始的向上方向(在本地空间中即为float3(0,1,0))计算向右的方向,并归一化

right=normalize(cross(up,normal));(使用向量的叉乘计算)

3.用计算后的向右方向和法线方向重新校正向上的方向,得到精确值

up'=normalize(cross(right,normal));

计算出旋转矩阵后对原始的顶点进行各自方向上的偏移

脚本如下:

  1. // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
  2.  
  3. Shader "MyUnlit/Billboarding"
  4. {
  5. Properties
  6. {
  7. _MainTex ("Texture", 2D) = "white" {}
  8. _Color("Color Tint",color)=(,,,)
  9. }
  10. SubShader
  11. {
  12. //对顶点进行变换需禁用合P
  13. Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true" "DisableBatching" = "True" }
  14.  
  15. Pass
  16. {
  17. //透明度混合
  18. Tags{ "lightmode" = "forwardbase" }
  19. ZWrite off
  20. Blend SrcAlpha OneMinusSrcAlpha
  21. Cull off
  22.  
  23. CGPROGRAM
  24. #pragma vertex vert
  25. #pragma fragment frag
  26. #pragma multi_compile_fog
  27.  
  28. #include "UnityCG.cginc"
  29.  
  30. struct appdata
  31. {
  32. float4 vertex : POSITION;
  33. float2 uv : TEXCOORD0;
  34. };
  35.  
  36. struct v2f
  37. {
  38. float2 uv : TEXCOORD0;
  39. UNITY_FOG_COORDS()
  40. float4 vertex : SV_POSITION;
  41. };
  42.  
  43. sampler2D _MainTex;
  44. float4 _MainTex_ST;
  45. fixed4 _Color;
  46.  
  47. v2f vert (appdata v)
  48. {
  49. v2f o;
  50. //计算模型空间中的视线方向
  51. float3 objViewDir = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, ));
  52.  
  53. //计算旋转矩阵的各个基向量
  54. float3 normalDir =normalize(objViewDir);
  55. float3 upDir =float3(, , );
  56. float3 rightDir = normalize(cross(normalDir, upDir));
  57. upDir = normalize(cross(normalDir, rightDir));
  58.  
  59. //用旋转矩阵对顶点进行偏移
  60. float3 localPos =rightDir * v.vertex.x + upDir * v.vertex.y + normalDir * v.vertex.z;
  61.  
  62. //将偏移之后的值作为新的顶点传递计算
  63. o.vertex = UnityObjectToClipPos(float4(localPos,));
  64. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  65. UNITY_TRANSFER_FOG(o,o.vertex);
  66. return o;
  67. }
  68.  
  69. fixed4 frag (v2f i) : SV_Target
  70. {
  71. fixed4 col = tex2D(_MainTex, i.uv);
  72. col.rgb *= _Color.rgb;
  73. UNITY_APPLY_FOG(i.fogCoord, col);
  74. return col;
  75. }
  76. ENDCG
  77. }
  78. }
  79. fallback "Transparent/VertexLit"
  80. }

Unity Shader 广告牌效果的更多相关文章

  1. Unity Shader - 消融效果原理与变体

    基本原理与实现 主要使用噪声和透明度测试,从噪声图中读取某个通道的值,然后使用该值进行透明度测试. 主要代码如下: fixed cutout = tex2D(_NoiseTex, i.uvNoiseT ...

  2. Unity Shader 景深效果

    效果 原理: 开启摄像机的深度模式,将深度保存到一张名为_CameraDepthTexture(Unity5.0之后才有)内置的纹理中. 如果深度在焦点范围内就用原图,否则就用模糊图. Shader: ...

  3. Unity Shader 玻璃效果

    一个玻璃效果主要分为两个部分,一部分是折射效果的计算,另一部分则是反射.下面分类进行讨论: 折射: 1.利用Grass Pass对当前屏幕的渲染图像进行采样 2.得到法线贴图对折射的影响 3.对采集的 ...

  4. 小强学渲染之Unity Shader噪声应用

    之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...

  5. Unity3D学习(八):《Unity Shader入门精要》——透明效果

    前言 在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道. Unity中通常使用两种方法来实现透明 :(1)透明度测试(AlphaTest)(2)透明度混合(AlphaBlend).前者往 ...

  6. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  7. 【Unity Shader】(五) ------ 透明效果之半透明效果的实现及原理

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题 [Unity Shader学习笔记](三) -- ...

  8. 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...

  9. Unity Shader 之 透明效果

    透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...

随机推荐

  1. SVG撑满页面

    当viewBox属性固定,默认修改svg标签的宽高,svg都会按比例缩放 我们现在不想按比例缩放,需要svg撑满整个画面 这里只需为svg标签添加一个关键属性:preserveAspectRatio ...

  2. Gson+GsonFormat+Postman简单粗暴解析json

    现在有时候之前的项目需要返回来修改bug看到以下这段代码 if (test != null) { JSONTokener jsonParser = new JSONTokener(test); JSO ...

  3. p12证书

    http://my.oschina.net/u/1245365/blog/196363

  4. The listener supports no services oracle注册监听

    问题登场: [oracle@my-e450 ~]$ lsnrctl status …… The listener supports no servicesThe command completed s ...

  5. 服务器CPU很高,频繁FullGC排查小总结

    可以分为如下步骤: ①通过 top 命令查看 CPU 情况,如果 CPU 比较高,则通过 top -Hp 命令查看当前进程的各个线程运行情况. 找出 CPU 过高的线程之后,将其线程 id 转换为十六 ...

  6. 8. [mmc subsystem] host(第二章)——sdhci

    一.sdhci core说明 1.sdhci说明 具体参考<host(第一章)--概述> SDHC:Secure Digital(SD) Host Controller,是指一套sd ho ...

  7. 机器学习(4)——PCA与梯度上升法

    主成分分析(Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化.去噪 通过映射,我们可以 ...

  8. django中嵌套的try-except

    # 因为此时为yaml模板,而且只抓取node port,所以这样处理效率快content_dict = parse_yaml(content.replace("{{", &quo ...

  9. conan使用(三)--打包只有头文件的库

    参考:https://docs.conan.io/en/latest/howtos/header_only.html?highlight=header%20only 对于只含头文件的库打包非常简单,以 ...

  10. HBuilder创建app

    一.app登录注册实现 1.首先进行布局,mhead,mbody 在app index.html内创建一个 a链接通过mui.openWindow跳到登录页面 <a class="mu ...