我必须要宣布一个不幸的消息:我们得抛弃跟随我们许久的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教程 八、半透明物体的初步探索相关推荐

  1. unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)

    效果: 双面渲染的透明度混合的物体.png 原图: transparent_texture.png Shader代码: Shader中2个Pass代码一样,一个只渲染背面,一个只渲染正面 // 透明度 ...

  2. unity 半透明混合问题_Unity 实时 半透明 阴影 shader

    简单阴影制作思路: 1:在角色脚底 放置一块平板 2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换 3: 得到投影在地面上的阴影 4:阴影直接渲染到 屏幕上 缺点: 上面的阴影无法 ...

  3. unity 太阳自发光_unity shader基础之——unity中实现环境光、自发光

    上篇主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光.环境光.漫反射.高光反射),后面几篇文章就开始在unity中实现这几种光照类型,本篇在unity实现自发光.环境光. 一.uni ...

  4. unity沙子堆积_Unity Shader 之 简单实现沙漠干旱热浪的效果

    CameraHotWave 脚本具体代码和代码说明如下: using UnityEngine; /// /// 实现相机热浪效果 /// [ExecuteInEditMode]     // 编辑状态 ...

  5. unity 画球面_Unity Gizmos教程之一 设置颜色绘制正方体球体

    GizmosTest 脚本具体内容如下: using UnityEngine; public class GizmosTest : MonoBehaviour { // Use this for in ...

  6. unity绘制管道_Unity可编程渲染管线(SRP)教程:一、自定义管线

    控制渲染 创建pipeline asset 和 instance. 剔除.过滤.排序.渲染. 保持内存清洁. 提供良好的编辑体验. 这是Unity scriptable render pipeline ...

  7. unity shader入门精要_Unity Shader 入门(二):shader 基础

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...

  8. Unity3d shader 教程一 准备

    Cg编程 游戏引擎中的Cg编程对于OpenGL或Direct3D应用程序,Unity比Cg编程要容易得多.网格和图像(即纹理)的导入由图形用户界面支持; mipmap和法线贴图可以自动计算; 最常见的 ...

  9. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

最新文章

  1. R语言删除ggplot可视化图中的所有x轴轴标签实战:ggplot可视化默认包含所有x轴轴标签、删除ggplot可视化图中的所有x轴轴标签实战
  2. sm4 前后端 加密_这7个开源的Spring Boot前后端分离项目整理给你
  3. springboot拦截器@Autowired为null解决
  4. C/C++编程的一些技巧
  5. 解读容器的 2020:寻找云原生的下一站
  6. 百度数据可视化图表套件echart实战
  7. 喜提 redir contributor
  8. 雷观(六):码农值千金
  9. js 静止f1到f12 和屏蔽鼠标右键
  10. 受保护的属性无法直接读取
  11. 5. soapui 测试
  12. 对比赛打分现场进行硬件连线的拓扑图_【评委计分系统-双屏版】参考硬件连线
  13. Qt QLCDNumber 13行实现 显示日期时间 颜色设置 刷新
  14. python绘制爱心气球_婚房布置气球爱心教程-婚房气球布置心形方法简单【蜜匠婚礼】...
  15. 8_21_2013_Problem B: SUME_太水
  16. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 个人笔记 题解
  17. 高德地图-2D转换为3D
  18. python神经网络分析案例_python神经网络实战
  19. 斗地主发牌及排序流程
  20. QRCODE 根据url生成二维码图片

热门文章

  1. 计算机练手速的游戏,玩手速的游戏有哪些 手机上练手速的游戏推荐
  2. 基于误差状态卡尔曼滤波惯性导航理论
  3. 计算机专转本考试2005年,2005年江苏省普通高校“专转本”统一考试计算机应用基础.doc...
  4. Win7 可关闭的服务启动项
  5. 十六.静态页面抽取模板 2021-03-31
  6. 如何将带GPS的网络化的软件定义无线电接收机应用于分布式和移动频谱监测?(二)
  7. 利用python处理txt文本,调整格式
  8. 蓝牙钥匙的PEPS技术原理
  9. HTC One X S720e 一键刷入boot.img教程
  10. Adb interface驱动无法安装解决方法!