Unity shader学习之Alpha Test
可以在fragment中使用cg的函数--clip来进行透明度测试。
函数定义如下:
void clip(float4 x);
void clip(float3 x);
void clip(float2 x);
void clip(float1 x);
void clip(float x);
参数:裁剪时使用的标量或矢量条件。
描述:如果给定参数的任何一个分量是负数,就会舍弃当前像素的输出颜色。等同于:
void clip(float4 x)
{
if (any(x < ))
discard;
}
转载请注明出处:http://www.cnblogs.com/jietian331/p/7154001.html
shader如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Alpha Test"
{
Properties
{
_MainTex("Main Texture", 2D) = "white" {}
_Specular("Specular", Color) = (,,,)
_Gloss("Gloss", Range(, )) =
_CutOff("Cut Off", Range(, )) =
} SubShader
{
Pass
{
Tags
{
"LightMode" = "ForwardBase"
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCg.cginc"
#include "Lighting.cginc" sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Specular;
float _Gloss;
float _CutOff; struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 pos : SV_POSITION;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
float3 worldLight : TEXCOORD2;
float3 worldView : TEXCOORD3;
}; v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.color;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldLight = normalize(WorldSpaceLightDir(v.vertex));
o.worldView = normalize(WorldSpaceViewDir(v.vertex));
return o;
} fixed4 frag(v2f i) : SV_TARGET
{
fixed4 albedo = tex2D(_MainTex, i.uv) * i.color; // alpha test
clip(albedo.a - _CutOff);
// equals to:
//if(albedo.a - _CutOff < 0)
// discard; fixed3 ambient = albedo.rgb * UNITY_LIGHTMODEL_AMBIENT.rgb;
fixed3 diff = albedo.rgb * _LightColor0.rgb * max(, dot(i.worldNormal, i.worldLight));
fixed3 halfDir = normalize(i.worldLight + i.worldView);
fixed3 spec = albedo.rgb * _Specular.rgb * pow(max(, dot(halfDir, i.worldNormal)), _Gloss);
fixed3 col = ambient + diff + spec;
return fixed4(col, );
} ENDCG
}
} Fallback "Diffuse"
}
效果如下:

资源如下:
http://files.cnblogs.com/files/jietian331/transparent_texture.rar
有2个问题:
1. 从效果图中可看出,alpha test 得到的透明效果很“极端”——要么完全透明,要么完全不透明,而且在边缘上参差不齐,有锯齿,这是因为在边界处纹理的透明度变化精度问题。
2. 在片元着色器中discard操作会造成性能的下降。为什么?
因为Unity采用了Early-Z技术来提高GPU的性能,即把深度测试提前,先进行深度测试,再进行片元着色器的着色,这样被舍弃的片元便不需要再进行片元着色器的处理了,这样有利于提升GPU的性能。
而这种技术与片元着色器的discard操作是冲突的,因此现代的GPU会判断片元着色器中的操作是否与提前测试冲突,如果有冲突就会禁用提前测试,也就造成了性能上的下降。
Unity shader学习之Alpha Test的更多相关文章
- Unity shader学习之Alpha Test的阴影
Alpha Test的阴影, shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...
- Unity shader学习之Alpha Blend
通过 ShaderLab 的 AlphaBlend 能够实现真正的半透明效果. 使用 AlphaBlend 时,需要关闭深度写入 ZWrite Off,但得非常小心物体的渲染顺序, RenderQue ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- 第四章 开始Unity Shader学习之旅(1)
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
- 【Unity Shader学习笔记】Unity基础纹理-单张纹理
1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...
- Unity shader学习之屏幕后期处理效果之高斯模糊
高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...
随机推荐
- iOS - 常用的CG结构体
CGPoint.CGSize.CGRect.CGRectEdge实际上都是结构体 一,几个常用的结构体 CGPoint 定义一个点,设置x坐标和y坐标 struct CGPoint { CGFlo ...
- [knowledge] big data things
http://hadoop.apache.org/ https://spark.apache.org/ https://nifi.apache.org/ https://www.cloudera.co ...
- [dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上
0. 前言 开了虚拟机,开始dpdk之前,我每天都干这几件事: [root@dpdk potatos]# modprobe uio [root@dpdk potatos]# insmod /root/ ...
- 2018/04/24 PHP 设计模式之注册树模式
之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...
- 关于linux下mysql安装和卸载
卸载:https://www.cnblogs.com/Lenbrother/articles/6203620.html 卸载Mysql 找到了这篇文章:http://zhangzifan.com/ce ...
- AlertWindowManager 弹出提示窗口使用帮助(上)
LookAndFeel(界面外观): NativeStyle:本地化界面为真实用系统内置外观 SkinName:本地化界面(NativeStyle:)设置为假可使用皮肤外观 OptionAnimate ...
- GIT中常用的命令
最近项目中使用到了GIT,所以记录一下GIT中常用的命令. GIT使用的客户端有Git Bash:http://code.google.com/p/msysgit/ 还有乌龟TortoiseGit:h ...
- Openvpn配置文件详解
一.vars配置文件 vars配置文件的主要内容如下: cat vars |grep -vE "^#|^$" KEY_DIR定义key生成的目录. KEY_SIZE定义生成私钥的大 ...
- 基于Apache Spark机器学习的客户流失预测
流失预测是个重要的业务,通过预测哪些客户可能取消对服务的订阅来最大限度地减少客户流失.虽然最初在电信行业使用,但它已经成为银行,互联网服务提供商,保险公司和其他垂直行业的通用业务. 预测过程是大规模数 ...
- Jmeter知识点
聚合报告说明 https://www.cnblogs.com/duanxz/p/5464993.html JMeter之Ramp-up Period(in seconds)说明(可同时并发) http ...