shader之——球形烟雾 CG函数saturate与abs的用法
今天接到个需求,做一个球形的烟雾,让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的用法相关推荐
- Unity shader烟雾效果与saturate函数用法
今天看到了一个烟雾纹理效果,学习转载一下: 代码 代码如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObject ...
- shader 4 杂 一些和函数名词、数据结构
Normal: 法线 Normao mapping: 法线贴图 Lighting mapping: 光照贴图 Bump mapping: 凹凸贴图:模拟粗糙外表面的技术. FX-Water ...
- 【Python】Numpy扩充数组函数之repeat和tile用法
2019独角兽企业重金招聘Python工程师标准>>> [Python]Numpy扩充数组函数之repeat和tile用法,有需要的朋友可以参考下. 用repeat和tile扩充数组 ...
- python装饰器原理-Python函数装饰器原理与用法详解
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
- Python语言学习之字母G开头函数使用集锦:global用法之详细攻略
Python语言学习之字母G开头函数使用集锦:global用法之详细攻略 global全局变量用法 global全局变量:python使用的变量默认一定是用局部变量:如果想使用作用域之外的全局变量,则 ...
- Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略
Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略 assert断言的用法 assert断言用法:防御性的编程.运行时对程序逻辑的检测.合约性检查(比如前置条件,后置条件).程序 ...
- Python语言学习之字母C开头函数使用集锦:count用法之详细攻略
Python语言学习之字母C开头函数使用集锦:count用法之详细攻略 count用法 list.count函数的用法 list=['America', 'America', '山东', '山东', ...
- C++容器的insert()函数有以下三种用法: 最终*it=val;
C++容器的insert()函数有以下三种用法: 最终*it=val; //用法1:在指定位置it前"插入"值为val的元素,返回指向这个元素的迭代器, iterator inse ...
- python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法
一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...
最新文章
- android面试题总结加强版
- python连接es_Elasticsearch --- 3. ik中文分词器, python操作es
- 计算机模拟考总结,高职单考单招计算机模拟一技术总结.doc
- MySQL 服务无法启动--服务没有报告任何错误 ---Failed to find valid data directory.
- 如何部署Windows Server 2016 中的Storage Spaces Direct超聚合解决方案
- AZURE-百万像素定焦镜头
- 栈 -- 4.1.1 Valid Parentheses I-II -- 图解
- phalapi做登录检测_1.4 PhalApi 2.x 接口响应与在线调试
- 晶闸管调压电路的matlab仿真,基于SIMULINK晶闸管调压电路仿真及分析.doc
- 瑞星杀毒软件linux序列号,瑞星杀毒软件2007光盘零售版是面向 Linux的?
- 车牌识别技术应用场景
- Codeforces Round #643 (Div. 2) C. Count Triangles 题解(思维)
- 港科夜闻|沈向洋教授获委任为香港科大校董会主席
- 基于百度云主机的USDP 2.x 安装详细教程
- css3 3d旋转图片立方体特效代码
- 汽车功能安全(一)~笔记
- Java面向对象与代码编写
- 限流——漏桶算法和令牌桶算法的区别
- python水位传感器输出水位_投入式水位传感器、投入式液位传感器的应用方法
- win10右下角资讯怎么关 win10右下角天气怎么关
热门文章
- Mysql Having的用法:对group by之后的分组加限制条件(复制)
- C语言丨关键字enum用法详解,看这篇就够了
- 两位数四则混合运算考试题
- 第二章 《凯斯迈之岛》
- Zookeeper监听机制
- 《防灾自救手册--地震》
- EduCoder 计算机网络实验 DNS协议分析
- $.getJSON的常用使用方法
- Android函数响应式编程——必学的RxJava变换操作符map、flatMap、cast、concatMap、flatMapIterable、buffer、groupBy
- k8s hostname ““ could not be reached