今天接到个需求,做一个球形的烟雾,让3D场景自己在场景里去摆放,贴图不是4方连续的,所以看上去有接缝哈,具体的让特效自己去调效果了:

遇到了一个从来都没注意过的问题,做了一个球形的烟雾,用了边缘透明的方式,同时用了Cull Off,但是无论如何都无法显示背面,找到了原因,在此记录一下。

shader代码如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "effects/Smoke"{
Properties {_MainTex ("Base layer (RGB)", 2D) = "white" {}_ScrollX ("Base layer Scroll speed X", Float) = 1.0_ScrollY ("Base layer Scroll speed Y", Float) = 0.0_brightness ("brightness", Float) = 2.0_color("color",color) = (1,1,1,1)
}SubShader {Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }pass {Zwrite Off Cull Off Blend SrcAlpha OneMinusSrcAlphaLOD 100CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_ST;float _ScrollX;float _ScrollY;float _brightness;fixed4 _color;struct appdata {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;fixed4 color : COLOR;};struct v2f {float4 pos : SV_POSITION;float2 uv : TEXCOORD0;fixed4 color : TEXCOORD1;float NdotV :TEXCOORD2;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord.xy,_MainTex) + frac(float2(_ScrollX, _ScrollY) * _Time);o.color =  v.color;float3 Normal =UnityObjectToWorldNormal( v.normal);float3 ViewDir =normalize( WorldSpaceViewDir( v.vertex));o.NdotV =pow (abs(dot (Normal,ViewDir)),3);return o;}fixed4 frag (v2f i) : COLOR{fixed4 tex = tex2D (_MainTex, i.uv);fixed4 o = tex * i.color * _brightness * _color;o.a = tex.r * i.color.a * i.NdotV;return o;}ENDCG}}
}

saturate 与 abs

o.NdotV =pow (saturate(dot (Normal,ViewDir)),3);

这里刚开始用了saturate,结果怎么都不显示双面,折腾了好久,师傅告诉我,saturate不是这么用的

saturate返回是0到1,而小于0的时候,也就是物体的背面,他永远是返回0

abs 返回的是绝对值,他才可以把物体背面的法线由负方向变成正常向

亲,如果您觉得本文不错,愿意给我一些动力的话,请用手机扫描二维码即可向我打赏

                                         打赏

shader之——球形烟雾 CG函数saturate与abs的用法相关推荐

  1. Unity shader烟雾效果与saturate函数用法

    今天看到了一个烟雾纹理效果,学习转载一下: 代码 代码如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObject ...

  2. shader 4 杂 一些和函数名词、数据结构

    Normal:  法线 Normao mapping: 法线贴图 Lighting mapping: 光照贴图 Bump mapping:     凹凸贴图:模拟粗糙外表面的技术. FX-Water ...

  3. 【Python】Numpy扩充数组函数之repeat和tile用法

    2019独角兽企业重金招聘Python工程师标准>>> [Python]Numpy扩充数组函数之repeat和tile用法,有需要的朋友可以参考下. 用repeat和tile扩充数组 ...

  4. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  5. Python语言学习之字母G开头函数使用集锦:global用法之详细攻略

    Python语言学习之字母G开头函数使用集锦:global用法之详细攻略 global全局变量用法 global全局变量:python使用的变量默认一定是用局部变量:如果想使用作用域之外的全局变量,则 ...

  6. Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略

    Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略 assert断言的用法 assert断言用法:防御性的编程.运行时对程序逻辑的检测.合约性检查(比如前置条件,后置条件).程序 ...

  7. Python语言学习之字母C开头函数使用集锦:count用法之详细攻略

    Python语言学习之字母C开头函数使用集锦:count用法之详细攻略 count用法 list.count函数的用法 list=['America', 'America', '山东', '山东', ...

  8. C++容器的insert()函数有以下三种用法: 最终*it=val;

    C++容器的insert()函数有以下三种用法: 最终*it=val; //用法1:在指定位置it前"插入"值为val的元素,返回指向这个元素的迭代器, iterator inse ...

  9. python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

    一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...

最新文章

  1. android面试题总结加强版
  2. python连接es_Elasticsearch --- 3. ik中文分词器, python操作es
  3. 计算机模拟考总结,高职单考单招计算机模拟一技术总结.doc
  4. MySQL 服务无法启动--服务没有报告任何错误 ---Failed to find valid data directory.
  5. 如何部署Windows Server 2016 中的Storage Spaces Direct超聚合解决方案
  6. AZURE-百万像素定焦镜头
  7. 栈 -- 4.1.1 Valid Parentheses I-II -- 图解
  8. phalapi做登录检测_1.4 PhalApi 2.x 接口响应与在线调试
  9. 晶闸管调压电路的matlab仿真,基于SIMULINK晶闸管调压电路仿真及分析.doc
  10. 瑞星杀毒软件linux序列号,瑞星杀毒软件2007光盘零售版是面向 Linux的?
  11. 车牌识别技术应用场景
  12. Codeforces Round #643 (Div. 2) C. Count Triangles 题解(思维)
  13. 港科夜闻|沈向洋教授获委任为香港科大校董会主席
  14. 基于百度云主机的USDP 2.x 安装详细教程
  15. css3 3d旋转图片立方体特效代码
  16. 汽车功能安全(一)~笔记
  17. Java面向对象与代码编写
  18. 限流——漏桶算法和令牌桶算法的区别
  19. python水位传感器输出水位_投入式水位传感器、投入式液位传感器的应用方法
  20. win10右下角资讯怎么关 win10右下角天气怎么关

热门文章

  1. Mysql Having的用法:对group by之后的分组加限制条件(复制)
  2. C语言丨关键字enum用法详解,看这篇就够了
  3. 两位数四则混合运算考试题
  4. 第二章 《凯斯迈之岛》
  5. Zookeeper监听机制
  6. 《防灾自救手册--地震》
  7. EduCoder 计算机网络实验 DNS协议分析
  8. $.getJSON的常用使用方法
  9. Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy
  10. k8s hostname ““ could not be reached