unity 半透明混合问题_Unity Shader教程 八、半透明物体的初步探索
我必须要宣布一个不幸的消息:我们得抛弃跟随我们许久的Sakura.shader,而创建一个新的shader了。它已经完成了自己的使命。
重新写一个shader吧,可以是一个在附加篇写的那种,这次我不会插嘴了。
写好之后再往下看。
/*
由于文件有些乱,所以我建了几个文件夹归了下类。这四个文件夹,除了Scenes是本来就有的,其余全是我建的。文件夹分类
*/
我给shader取名Translucent,意思是半透明的;同时也创建了材质,把shader赋到材质上。再创建个小球,把材质赋到小球上,这样我们可以直观看出效果。
我这里shader写完了,呐,效果是这样的:shader效果
别忘了,我们这节要学的是半透明。什么半透明?就是只狼里月隐糖的那种,
半透明的狼
显示一部分本身颜色,显示一部分被遮住景物的颜色。
黑体字部分就是半透明物体的本质,一部分后面的颜色,一部分当前的颜色。肯定不能直接相加,否则就那个都看不清,一定有个比例控制着。假设物体本身的颜色为s(Source源头的缩写),被遮住景色的颜色为d(Destination目的地的缩写),那么半透明物体返回的颜色为:
s*x + d*y
其中x和y是数值参数,表示颜色的比例。显然,当x越小,y越大,物体本身的颜色越少,背景的颜色越多,透明程度越高;当x=0,y=1时,物体完全透明:因为返回的颜色已经没有物体本身的份了,全是被遮住的颜色。反之亦然,当x越大,y越小,物体本身的颜色越多,被遮景物的颜色越少,物体越不透明。当x=1,y=0时物体完全不透明。
由是能看出x和y的关系:都为正数且和为1。
你可能早已想到,或者观察到,为什么shader每次返回的颜色,最后一个分量都是1?返回的颜色值a为1
你记得,这个分量表示颜色的透明度,越小越透明。可你对它进行修改,改成0.5,改成0.1,甚至改成0,物体都毫无透明效果?
(此处无图,自己去试)
那是因为,我们没有开透明开关。开启的方法跟使不删除背面一样,是一条语句:
Blend SrcAlpha OneMinusSrcAlphaBlend语句
也是写在CG代码之上。这种语句叫透明度混合,由混合(Blend)打头(为什么叫混合?经过上面的解释你很好理解,就是物体颜色和背景颜色按一定比例混合)。混合的比例在之后的两个词:SrcAlpha表示物体的透明度,OneMinusSrcAlpha表示1减去物体透明度的差。
这行语句会用第一个词代表的数(上面表达式的x)乘以物体的颜色,加上第二个词代表的数(上面表达式的y)乘以背景的颜色,返回最后的结果(为什么是“词代表的数”?因为这个数你不能自己瞎写)。同样可以表示数的词有:One,Zero,DstAlpha,OneMinusDstAlpha。意思就是英语字面意思。凡是含Src的就表示本物体的(使用本shader的物体),而含Dst的表示被遮住的景色的。
我们上面用的那个命令是最常用的:
Blend SrcAlpha OneMinusSrcAlpha
因为它完美切合了实际效果,正如我们上面叙述过的。
可以试试哦,在片元函数返回颜色的最后一个值那写个0.5:把a值改成0.5
咋一看好像还可以,但稍微转动下视角就会发现奇怪之处:透明了天空盒
物体透明的后面是天空盒?我那么大一个麻衣球呢?
原因是渲染顺序。是的,unity物体的渲染是讲顺序的。顺序分类型有数值,越小的越先渲染。在材质面板下可以看到其顺序(Render Queue,渲染序列),From Shader表示顺序来源,shader默认是不透明物体(在这叫几何体Geometry),顺序是2000。点击它可以看到三个类型,第一个是Geometry,第二个是AlphaTest,顺序2450;第三个是Transparent顺序3000。上节我们实现的那个透明效果严格来说是AlphaTest,透明度测试,也应该调整下顺序的;本节实现的半透明效果是应该在Tranparent顺序下的。切换到透明顺序
切换完后,你会发现,很amazing的效果吧!
/*
你也看到了,渲染顺序中有个From Shader,表明我们可以在shader中设置渲染顺序。使用的语句为:
Tags {“Queue”=”Transparent”}在shader里设置渲染顺序
记住是在SubShader下写而不是Pass。
会把shader的渲染顺序设为3000。同样你也可以更换Transparent为AlphaTest或Geometry,来变更渲染顺序。
*/
现在我们可以通过控制片元函数返回颜色的a值来控制物体的透明度了,来玩点更有意思的。比如,让a成为一个变数:
float a = max(0, dot(l, i.worldNormal));
return fixed4(diffuse + ambient + specular, a);计算特定数值来控制a值
代码意思嘛,你知道的,向光面显现,背光面透明。背光面透明
再来:
float a = max(0, dot(v, i.worldNormal));
(就是把上式的 l 改成 v ,光线方向改成视角方向)这个效果很梦幻:边缘隐去
朝向我们的面显现,边缘的面渐隐。来,求1减去它的差看效果:
float a = 1 - max(0, dot(v, i.worldNormal));中心掏空
这就成了中间透明,边缘显现的效果(像不像山吹的盾)!很amazing吧。联系之前学得的光线方向,法线方向,视角方向,你可以做出更多有趣的效果。
试试用纹理来控制:
_AlphaTex(“透明度纹理”, 2D)=“white”{}
sampler2D _AlphaTex;
这两个语句各该放哪你肯定知道。
取色赋值:
a = tex2D(_AlphaTex, i.uv).r;纹理取值
看效果:纹理透明
真·半隐半现的球。
真正的半透明效果很难实现,我们在这只是对它进行了模拟。一般情况下是够用了的,更高级的半透明效果(比如次表面散射)咱们以后细说。
下一节咱们开始对已知内容进行完善,这是必要的。
unity 半透明混合问题_Unity Shader教程 八、半透明物体的初步探索相关推荐
- unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)
效果: 双面渲染的透明度混合的物体.png 原图: transparent_texture.png Shader代码: Shader中2个Pass代码一样,一个只渲染背面,一个只渲染正面 // 透明度 ...
- unity 半透明混合问题_Unity 实时 半透明 阴影 shader
简单阴影制作思路: 1:在角色脚底 放置一块平板 2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换 3: 得到投影在地面上的阴影 4:阴影直接渲染到 屏幕上 缺点: 上面的阴影无法 ...
- unity 太阳自发光_unity shader基础之——unity中实现环境光、自发光
上篇主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光.环境光.漫反射.高光反射),后面几篇文章就开始在unity中实现这几种光照类型,本篇在unity实现自发光.环境光. 一.uni ...
- unity沙子堆积_Unity Shader 之 简单实现沙漠干旱热浪的效果
CameraHotWave 脚本具体代码和代码说明如下: using UnityEngine; /// /// 实现相机热浪效果 /// [ExecuteInEditMode] // 编辑状态 ...
- unity 画球面_Unity Gizmos教程之一 设置颜色绘制正方体球体
GizmosTest 脚本具体内容如下: using UnityEngine; public class GizmosTest : MonoBehaviour { // Use this for in ...
- unity绘制管道_Unity可编程渲染管线(SRP)教程:一、自定义管线
控制渲染 创建pipeline asset 和 instance. 剔除.过滤.排序.渲染. 保持内存清洁. 提供良好的编辑体验. 这是Unity scriptable render pipeline ...
- unity shader入门精要_Unity Shader 入门(二):shader 基础
一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...
- Unity3d shader 教程一 准备
Cg编程 游戏引擎中的Cg编程对于OpenGL或Direct3D应用程序,Unity比Cg编程要容易得多.网格和图像(即纹理)的导入由图形用户界面支持; mipmap和法线贴图可以自动计算; 最常见的 ...
- Unity游戏开发官方入门教程:飞机大战(六)——创建子弹
Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...
最新文章
- R语言删除ggplot可视化图中的所有x轴轴标签实战:ggplot可视化默认包含所有x轴轴标签、删除ggplot可视化图中的所有x轴轴标签实战
- sm4 前后端 加密_这7个开源的Spring Boot前后端分离项目整理给你
- springboot拦截器@Autowired为null解决
- C/C++编程的一些技巧
- 解读容器的 2020:寻找云原生的下一站
- 百度数据可视化图表套件echart实战
- 喜提 redir contributor
- 雷观(六):码农值千金
- js 静止f1到f12 和屏蔽鼠标右键
- 受保护的属性无法直接读取
- 5. soapui 测试
- 对比赛打分现场进行硬件连线的拓扑图_【评委计分系统-双屏版】参考硬件连线
- Qt QLCDNumber 13行实现 显示日期时间 颜色设置 刷新
- python绘制爱心气球_婚房布置气球爱心教程-婚房气球布置心形方法简单【蜜匠婚礼】...
- 8_21_2013_Problem B: SUME_太水
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 个人笔记 题解
- 高德地图-2D转换为3D
- python神经网络分析案例_python神经网络实战
- 斗地主发牌及排序流程
- QRCODE 根据url生成二维码图片
热门文章
- 计算机练手速的游戏,玩手速的游戏有哪些 手机上练手速的游戏推荐
- 基于误差状态卡尔曼滤波惯性导航理论
- 计算机专转本考试2005年,2005年江苏省普通高校“专转本”统一考试计算机应用基础.doc...
- Win7 可关闭的服务启动项
- 十六.静态页面抽取模板 2021-03-31
- 如何将带GPS的网络化的软件定义无线电接收机应用于分布式和移动频谱监测?(二)
- 利用python处理txt文本,调整格式
- 蓝牙钥匙的PEPS技术原理
- HTC One X S720e 一键刷入boot.img教程
- Adb interface驱动无法安装解决方法!