Unity3D Shader官方教程翻译(十)----Shader语法:Pass的Alpha测试

[UnityShader]多Pass处理透明度 在shader中想让物体出现透明的地方有两种思路。 把物体的渲染队列设置为transparent,此时的物体将会在所有不透明物体之后渲染,从而保证正确的渲染结果。然后我们使用Blend指令来把原颜色缓冲区的颜色乘上当前物体的a通道值,来进行混合。 使用Clip指令来对物体的像素进行裁剪。 Blend指令 每经过一个pass物体就会产生一个临时颜色缓冲区(假设当前为M,上一个颜色缓冲区为N)。 ... 阅读详情




ShaderLab syntax: Alpha testing

The alpha test is a last chance to reject a pixel from being written to the screen.

alpha测试是最后一个机会,拒绝将一个像素写到屏幕上。(可以理解为在将画面显示到屏幕上的最后1次修改,这次修改只能让该像素显示或不显示)

点击浏览下一页

After the final output color has been calculated, the color can optionally have its alpha value compared to a fixed value. If the test fails, the pixel is not written to the display.

在最后的输出颜色被计算之后,这个颜色可以选择是否让自己的alpha值和一个固定值做比较。如果测试失败,这个像素将不在屏幕上显示。

指导:当每个像素即将绘制时,如果启动了Alpha测试,OpenGL会检查像素的Alpha值,只有Alpha值满足条件的像素才会进行绘制(严格的说,满足条件的像素会通过本项测试,进行下一种测试,只有所有测试都通过,才能进行绘制),不满足条件的则不进行绘制。这个“条件”可以是:始终通过(默认情况)、始终不通过、大于设定值则通过、小于设定值则通过、等于设定值则通过、大于等于设定值则通过、小于等于设定值则通过、不等于设定值则通过。

如果我们需要绘制一幅图片,而这幅图片的某些部分又是透明的(想象一下,你先绘制一幅相片,然后绘制一个相框,则相框这幅图片有很多地方都是透明的,这样就可以透过相框看到下面的照片),这时可以使用Alpha测试。将图片中所有需要透明的地方的Alpha值设置为0.0,不需要透明的地方Alpha值设置为1.0,然后设置Alpha测试的通过条件为:“大于0.5则通过”,这样便能达到目的。当然也可以设置需要透明的地方Alpha值为1.0,不需要透明的地方Alpha值设置为0.0,然后设置条件为“小于0.5则通过”。Alpha测试的设置方式往往不只一种,可以根据个人喜好和实际情况需要进行选择。

Syntax 语法

AlphaTest Off
Render all pixels (default).
关闭alpha测试,渲染所有像素
 
AlphaTest  comparison AlphaValue
Set up the alpha test to only render pixels whose alpha value is within a certain range.
设置alpha测试:仅当像素的alpha值处在一定范围之内才渲染它

Comparison 比较命令

Comparison is one of the following words:

比较命令式下面中的1个

Greater Only render pixels whose alpha is greater than AlphaValue.  只渲染alpha值比AlphaValue大的像素
GEqual Only render pixels whose alpha is greater than or equal to AlphaValue. 只渲染alpha值>=AlphaValue的像素
Less Only render pixels whose alpha value is less than AlphaValue. 只渲染alpha值<AlphaValue的像素
LEqual Only render pixels whose alpha value is less than or equal to from AlphaValue. 只渲染alpha值<= AlphaValue的像素
Equal Only render pixels whose alpha value equals AlphaValue. 只渲染alpha值=AlphaValue的像素
NotEqual Only render pixels whose alpha value differs from AlphaValue. 只渲染alpha值不等于AlphaValue的像素
Always Render all pixels. This is functionally equivalent to AlphaTest Off. 渲染所有像素相当于关闭alpha测试
Never Don't render any pixels. 不渲染任何像素

AlphaValue  alpha值

A floating-point number between 0 and 1. This can also be a variable reference to a float or range property, in which case it should be written using the standard square bracket notation ([VariableName]).

alpha值是0~1之间的浮点数。这也可以是一个可以被引用的float变量或范围属性,在这种情况下,它应该使用标准的方括号来表示([变量名])。

Details 详情

The alpha test is important when rendering concave objects with transparent parts. The graphics card maintains a record of the depth of every pixel written to the screen. If a new pixel is further away than one already rendered, the new pixel is not written to the display. This means that even with Blending, objects will not show through.

当渲染1个凹面物体的半透明部分的时候,alpha测试是很重要的。显卡会持续记录写入到屏幕上的每1个像素的深度值。如果1个新像素比1个已经渲染的像素在同一个屏幕上的位置更远时候,这个新的像素将不会被渲染。这意味着就算使用混合效果,这个物体仍然不会被显示。

点击浏览下一页

In this figure, the tree on the left is rendered using AlphaTest. Note how the pixels in it are either completely transparent or opaque. The center tree is rendered using only Alpha Blending - notice how transparent parts of nearby branches cover the distant leaves because of the depth buffer. The tree on the right is rendered using the last example shader - which implements a combination of blending and alpha testing to hide any artifacts.

在此图中,左边的树使用了alpha测试,请注意它的像素或者是全透明或者是不透明。中间的树仅仅使用了alpha混合,请注意临近树枝的透明部分由于深度缓冲的原因覆盖了远处的树叶。右边的树使用了最后1个例子的着色器,这个着色器实现了混合效果和alpha测试,隐藏了假象。

Examples 例子

The simplest possible example, assign a texture with an alpha channel to it. The object will only be visible where alpha is greater than 0.5

这是1个尽可能简单的例子,分配给它一个带有alpha通道的纹理。这个物体中仅有alpha值大于0.5的部分可见。

Shader "Simple Alpha Test" {
	Properties {
		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
	}
	SubShader {
		Pass {
			// Only render pixels with an alpha larger than 50%
			AlphaTest Greater 0.5
			SetTexture [_MainTex] { combine texture }
		}
	}
}

This is not much good by itself. Let us add some lighting and make the cutoff value tweakable:

这个效果不是很好,我们添加一些光照和一个变量给它,使它可以调整AlphaTest的值
Shader "Cutoff Alpha" {
	Properties {
		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
		_Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
	}
	SubShader {
		Pass {
			// Use the Cutoff parameter defined above to determine
			// what to render.
			AlphaTest Greater [_Cutoff]
			Material {
				Diffuse (1,1,1,1)
				Ambient (1,1,1,1)
			}
			Lighting On
			SetTexture [_MainTex] { combine texture * primary }
		}
	}
} 

When rendering plants and trees, many games have the hard edges typical of alpha testing. A way around that is to render the object twice. In the first pass, we use alpha testing to only render pixels that are more than 50% opaque. In the second pass, we alpha-blend the graphic in the parts that were cut away, without recording the depth of the pixel. We might get a bit of confusion as further away branches overwrite the nearby ones, but in practice, that is hard to see as leaves have a lot of visual detail in them.

我们渲染了植物和树木,许多游戏具有典型alpha测试的硬边界。解决这个问题的办法是渲染这个物体2次。在第1个pass中,我们使用alpha测试仅仅去渲染那些半透明值大于50%的像素。在第2个pass中,我们使用alpha混合那些我们切掉的图形,不再记录这些像素的深度。远处的叶子覆盖掉了近处的叶子,在这里我们也许有些混乱,但在现实中,我们很难看到叶子的许多细节。

Shader "Vegetation" {
	Properties {
		_Color ("Main Color", Color) = (.5, .5, .5, .5)
		_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
		_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
	}
	SubShader {
		// Set up basic lighting
		Material {
			Diffuse [_Color]
			Ambient [_Color]
		}
		Lighting On
		// Render both front and back facing polygons.
		Cull Off
		// first pass:
		//   render any pixels that are more than [_Cutoff] opaque
		Pass {
			AlphaTest Greater [_Cutoff]
			SetTexture [_MainTex] {
				combine texture * primary, texture
			}
		}
		// Second pass:
		//   render in the semitransparent details.
		Pass {
			// Dont write to the depth buffer
			ZWrite off
			// Don't write pixels we have already written.
			ZTest Less
			// Only render pixels less or equal to the value
			AlphaTest LEqual [_Cutoff]
			// Set up alpha blending
			Blend SrcAlpha OneMinusSrcAlpha
			SetTexture [_MainTex] {
				combine texture * primary, texture
			}
		}
	}
} 

Note that we have some setup inside the SubShader, rather than in the individual passes. Any state set in the SubShader is inherited as defaults in passes inside it.

 注意我们在SubShader中做了一些设置,而不是在独立的pass中。所有在SubShader中做的设置将被当做其中pass的默认值。

由www.J2meGame.com原创,转载请说明。


Unity 可编程渲染管线 LWRP 的详细步骤 这篇文章的主要内容是讲Unity的内置可编程渲染管线LWRP的渲染流程。即这一帧内从开始到结束所经过的渲染步骤。 由于版本时效性,我写博文时所用的Unity版本和LWRP的package版本分别是: Unity版本:2018.3.0f2 LWRP的版本为:4.10.0.preview 先上LWRP里面关于核... 阅读详情

相关推荐

Unity面试题总结

Unity面试题

sinat_34014668的博客 1万+

Unity烘焙AlphaTest材质阴影

Unity内烘焙AlphaTest材质,比如植物树叶,有时候阴影会没有正确显示AlphaTest

糕二不二的博客 3441

【ISAR成像定标方法(1)—转台目标的RD成像算法MATLAB仿真】

ISAR成像定标方法的研究具有重要意义,但是与之相关的学习资料以及仿真对于小白来说很难找或者很杂乱,本人作为小白之一在研究过程中苦不堪言,现在自己所要研究的定标内容已经完成,以后还学不学雷达也不一定,因为后面的路更难,现在打算把一些相关推导和仿真结果列出来,以供小白交流学习使用,希望能有点帮助。(PS:由于公式和符号的原因,采用图片形式说明)

此木旧年的博客 6418

大学物理(英文版)笔记 chapter1 Measurement

1 Measurement1.1 What is Physics?1.2 Measuring Things1.3 The International System of Units1.4 Changing Units(单位转换)1.5 Length1.6 Time1.7 MassThe Standard KilogramA Second Mass Standard(第二质量标准)Density(密度) 1.1 What is Physics? Science and engineering are base

m0_59751822的博客 1208

Remote ID的调制解调FPGA实现

Remote ID源于航空安全需求,例如在无人机密集区域实现设备跟踪和防碰撞。它类似于航空领域的ADS-B系统,但针对低空飞行器。Remote ID系统通常工作在特定频段(如2.4 GHz或5.8 GHz),通过无线链路广播数据包,包含设备ID、经纬度、高度和速度等信息。调制解调过程确保这些数据在噪声环境中可靠传输。例如,标准如ASTM F3411定义了Remote ID的协议框架,其中调制解调是关键物理层组件。

yulongfenghu的博客 1506

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2100

到目前为止遇到的一些错误解决

最近经常会有一些很低级的错误,拼写错误啊,或者是项目的异常报错,这个时候突然发现,当一个maven项目中的某个子项目的pom文件有报错的时候,根据依赖层次依次的maven install下就好了...

execution.Welcome(you); 334

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python)

前程算法屋的博客 900

【前端代码校验规则】Eslint、Stylelint、Prettier、lint-staged、husky、commitlint

【前端代码校验规则】Eslint、Stylelint、Prettier、lint-staged、husky、commitlint

zywhccyw的博客 5627

道路场景分割:车道线、可行驶区域与路沿检测

道路场景分割:车道线、可行驶区域与路沿检测​ ,人工智能,计算机视觉,大模型,AI,文章围绕道路场景分割展开,涵盖车道线、可行驶区域与路沿检测。介绍了基本概念、重要性,各部分检测的类型、方法、难点及解决思路,还涉及技术融合、数据集、评价指标、发展趋势、应用案例、代码示例、不同天气处理、实际问题与方案、实现流程、相关技术工具、教育研究应用、产业前景、伦理安全问题及学习资源等,全面阐述了道路场景分割的多方面内容,为相关学习和研究提供了丰富信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

Unity3D Shader官方教程翻译(五)----Shader语法:Pass

ShaderLab syntax: Pass ShaderLab 语法:Pass(通道编程) The Pass block causes the geometry of an object to be rendered once. 1个Pass块可以使一个几何物体被一次渲染。 Syntax 语法 Pass { [Name and Tags] [RenderSet

u010216987的专栏 741

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 204

Unity3D Shader官方教程翻译(一)

Unity3D Shader官方教程翻译 Shader Reference 着色参考 Shaders in Unity can be written in one of three different ways: Unity3D着色器,可以写在三种不同的方式之一: assurface shaders, asvertex and fragm

roadProgram的专栏 918

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Unity3D Shader官方教程翻译(四)

Unity3D Shader官方教程翻译(四) 1、Shader语法:Pass的雾化处理 雾化混合产生像素的颜色是依据于常量颜色(这个常量颜色是基于摄像头的距离的)。雾化不会改变像素的alpha值,仅仅是改变它的rgb分量。 指导:雾化是一种模拟自然界中雾气对场景物体视觉效果产生影响的图形绘制技术。此技术从视点到物体逐渐将物体的绘制颜色淡化,直至背景色。通过雾化处理可较好

胡胜同学 1175

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器

Writing Surface Shaders Writing shaders that interact with lighting is complex. There are different light types, different shadow options, different rendering paths (forward and deferred rendering)

苗伟业的专栏 1514

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Unity Shaders】Alpha Test和Alpha Blending

写在前面关于alpha的问题一直是个比较容易摸不清头脑的事情,尤其是涉及到半透明问题的时候,总是不知道为什么A就遮挡了B,而B明明在A前面。这篇文章就总结一下我现在的认识~Alpha Test和Alpha Blending是两种处理透明的方法。Alpha Test采用一种很霸道极端的机制,只要一个像素的alpha不满足条件,那么它就会被fragment shader舍弃,“我才不要你类!”。被...

weixin_34381687的博客 891

Stylelint规则体系全解析

本文全面解析Stylelint的规则体系,涵盖语法验证、代码规范、命名约定和现代CSS特性支持四大核心领域。通过详细的规则说明、配置示例和实际应用场景,帮助开发者建立完善的CSS代码质量保障体系,提升团队协作效率和项目可维护性。 ## 语法验证类规则详解 Stylelint作为强大的CSS代码质量工具,其语法验证类规则构成了代码质量保障的第一道防线。这些规则专门用于检测和防止CSS语法错误、...

gitblog_00870的博客 948
上一篇: Unity3D Shader官方教程翻译(九)----Shader语法:Pass的雾化处理
下一篇: Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
夜色。
博客等级 码龄16年 468粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值