shader篇-透明效果

标签(空格分隔): shader


  • shader篇-透明效果

    • 透明效果实现方法简介
    • 渲染顺序的重要性
    • Unity shader的渲染顺序
    • 透明度测试
    • 透明度混合
    • 开启深度写入的半透明效果
    • 双面渲染

透明效果实现方法简介

Unity中使用2种方法实现透明效果:一是透明度测试,二是透明度混合。
透明度测试:不需要关闭深度写入,透明度不达标就去掉,所以物体要么不透明要么完全透明。
透明度混合:可以得到真正的半透明效果。原理是将透明度与颜色缓冲的颜色混合得到新的颜色。但是这需要关闭深度写入。只有关闭深度写入才能吧保证半透明物体不影响不透明物体或半透明后面半透明物体的渲染

渲染顺序的重要性

关闭深度写入后就需要注意物体的渲染顺序,因为关闭之前物体的渲染是由深度z-buffer决定,必须渲染半透明物体后的非透明后物体(这里的前后指的是相对虚拟摄像头的距离),再渲染透明物体,否则未关闭的深度测试会直接覆盖透明度混合后的颜色缓冲,导致失去了该有的半透明效果。
可是即便设置好了渲染顺序,有时候依旧会出现问题,比如两根缠绕的绳子,根本难以分清2个物体的前后,无法制定合理的渲染顺序。
要想解决这种问题就需要分割网格。

Unity shader的渲染顺序

为解决渲染顺序,unity提供了渲染队列。Queue标签决定模型使用哪个队列

名称 队列索引 描述
Background 1000 最早渲染的队列,用于渲染背景
Geometry 2000 默认渲染队列,不透明物体使用这个
AlphaTest 2450 透明度测试
Transparent 3000 使用透明度混合或关闭深度写入的shader
Overlay 4000 使用一些叠加效果,最后渲染的物体都使用该队列

使用实例
如果要使用透明度测试,需要这般加入以下tag

SubShader {Tags {"Queue"="AlphaTest" 

同理,透明度混合需要这般使用以下tag

    SubShader {Tags {"Queue"="Transparent"

透明度测试

unity片元着色器会使用clip函数进行透明度测试

void clip(float4 x)
{if(any(x<0))discard;
}

配置
配置中tags相当关键,Queue标签之前提过,暂且不提RenderType是用以制定渲染的队列,”IgnoreProjector”=”True”是保证shader不受投影器的影响

Properties {_Color ("Color Tint", Color) = (1, 1, 1, 1)_MainTex ("Main Tex", 2D) = "white" {}_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5}SubShader {Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}Pass {Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;//_Cutoff范围只有[0,1],所有使用fix精度fixed _Cutoff;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;};

顶点着色器

v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}

片元着色器
透明度测试在这里进行

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed4 texColor = tex2D(_MainTex, i.uv);// Alpha testclip (texColor.a - _Cutoff);// Equal to
//              if ((texColor.a - _Cutoff) < 0.0) {//                  discard;
//              }fixed3 albedo = texColor.rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));return fixed4(ambient + diffuse, 1.0);}

Fallback
使用内置的Transparent/Cutout/VertexLit的作为fallback保证shader无法在当前显卡工作时有可替换的shader。

FallBack "Transparent/Cutout/VertexLit"

透明度混合

同样,对应透明度混合,unity提供了内置命令Blend

语义 描述
Blend Off 关闭混合
Blend SrcFactor DstFactor 开启混合

代码实现
首先是配置

Properties {_Color ("Color Tint", Color) = (1, 1, 1, 1)_MainTex ("Main Tex", 2D) = "white" {}_AlphaScale ("Alpha Scale", Range(0, 1)) = 1}SubShader {Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}Pass {Tags { "LightMode"="ForwardBase" }//关闭深度写入ZWrite Off//开启透明度混合Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;fixed _AlphaScale;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;};

片元着色器

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed4 texColor = tex2D(_MainTex, i.uv);fixed3 albedo = texColor.rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));//在这里设置透明度通道,必须使用Blend命令,设置透明度通道才有意义return fixed4(ambient + diffuse, texColor.a * _AlphaScale);}

开启深度写入的半透明效果

开启深度写入也可以实现半透明效果,不过需要使用2个pass,会造成一定的性能损耗

Pass {ZWrite OnColorMask 0
}Pass {之前的透明度混合代码

这第一个pass是为把模型深度信息输入深度缓存,同时设置ColorMask为0让该pass不用输出任何掩饰

双面渲染

这实现是取消了剔除功能,渲染了所有物体,会消耗较多的性能

    Cull Off//关闭剔除功能

透明度混合的双面渲染
由于开启了双面渲染,为保证渲染顺序,我们需要重新设置代码

Pass {// First pass renders only back faces Cull FrontZWrite OffBlend SrcAlpha OneMinusSrcAlpha。。。。}Pass {Tags { "LightMode"="ForwardBase" }// Second pass renders only front faces Cull Back。。。。

使用2个pass利用cull指令制定渲染顺序,从而剔除不同朝向的渲染图元

这只是我个人的学习笔记和个人总结,如有不当之处,望指正。

shader篇-透明效果相关推荐

  1. Unity Shader 之 透明效果

    本文引用 Unity Shader入门精要 开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,还有--透明度.透明度为1,则完全不透明,透明度为0,则完全不会显示. 在Unity ...

  2. unity shader 纹理透明效果

    1.纹理映射基础 (1)纹理映射通过(u,v)坐标实现.注意:这句话时博主当时面试一家外企被问到的问题. (2)添加纹理属性:--MainTex("Main Tex",2D)=&q ...

  3. Unity Shader 实现透明护盾效果

    这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...

  4. 透明效果 -- Shader入门精要学习(7)

    透明效果 对于不透明的物体,不考虑其渲染顺序也能得到正确的结果,这是由于强大的深度缓冲的存在 几个概念: 深度缓冲(z-buffer):用于解决可见性问题,它可以决定哪个物体的哪些部分会被渲染在前面, ...

  5. Unity Shader透明效果

    在实时渲染中要实现透明效果,通常会在渲染模型时控制他的透明通道.当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性--透明度.当透明度为1时表示该像素是完全 ...

  6. 《Unity着色器和屏幕特效》——2.2 进阶的透明效果

    本节书摘来自华章计算机<Unity着色器和屏幕特效>一书中的第2章,第2.2节,作者[美]杰米·迪恩(Jamie Dean),译 周翀,张薇,更多章节内容可以访问云栖社区"华章计 ...

  7. 使窗体拥有透明效果的API

    一.背景FlashGet的透明效果大家羡慕吧.传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAt ...

  8. 网页设计中 透明效果的使用技巧

    运用好透明效果是提高网页设计水准的重要方法之一.如同使用其他方法一样,设计师们有很多种手段将透明效果运用到网页中,今天这篇文章就来好好和您分享一下关于"透明"的实用小技巧哟:) 在 ...

  9. UnityShader14.1:透明效果实现(下)

    接上文:UnityShader14:透明效果实现(上) 四.开启深度写入的透明效果 对比下面两种渲染效果: 前面提到过,透明物体的渲染顺序非常重要,对于一个复杂的透明物体,若不进行网格分割,那么几乎不 ...

  10. ai中如何插入签名_怎么将CAD中插入图片的多余部分抠掉?如何设置透明效果?...

    下面是本公众号文章分类目录,点击标题文字可打开分类文章列表: CAD安装卸载  异常.退出  文件及输入输出  基本操作技巧  各种设置及相关问题  界面和显示相关问题  快捷键  视图设置和调整   ...

最新文章

  1. vue+element 后台管理系统(三)树形图
  2. 【经验分享】非科班出身怎么转行计算机?
  3. 087-把PHP数组中的元素按随机顺序重新排列shuffle
  4. [Tyvj1114 搭建双塔]
  5. Android卷一全文 第一章 阅读前的准备工作
  6. zanli_android_1.1.0,【轻松集赞】写了个涉嫌混淆微信官方服务的小程序
  7. Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
  8. jquery系列教程8-jquery插件大全
  9. 系统学习机器学习之增强学习(一)--模型基础
  10. 解决Zarp报错,成功运行
  11. 监管科技崛起:从FinTech到RegTech
  12. MATLAB基础教程
  13. Unity3d C#获取海康/大华摄像头在萤石平台直播视频流功能(含源码)
  14. 计算机音译英语单词,汉语谐音英文单词
  15. 速写人物的脸型怎么画?如何画好人物脸型?
  16. 量子计算计算机简史pdf,量子计算与量子信息简介.pdf
  17. 点餐微信小程序【源码好又多】
  18. js设置button和input不可点击
  19. 畅言插件,http换成https失效了
  20. 潮水退去 你还是那个让HR离不开的猎头吗

热门文章

  1. gmap 支持python吗_在gmap中使用bokeh的python为for circle添加工具提示
  2. python 生孩子朋友圈_新生儿出生朋友圈说说,生孩子报喜唯美句子
  3. NetSuite BOM材料产出率舍入
  4. 解决Substrate节点模板编译失败ailed to run custom build command for `tikv-jemalloc-sys v0.4.3+5.2.1-patched.2`
  5. essay写作要点以及正确的书写格式
  6. BUUCTF Misc wp大合集(1)
  7. 51nod1359 循环探求
  8. 关于火狐浏览器访问淘宝网页时,点击店家旺旺无法弹出对话框的解决方案
  9. PHP面试技巧——如何准备电话面试?
  10. 手机安全卫士------手机防盗页面之sim卡绑定读取联系人