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个

GreaterOnly render pixels whose alpha is greater than AlphaValue.  只渲染alpha值比AlphaValue大的像素
GEqualOnly render pixels whose alpha is greater than or equal to AlphaValue. 只渲染alpha值>=AlphaValue的像素
LessOnly render pixels whose alpha value is less than AlphaValue. 只渲染alpha值<AlphaValue的像素
LEqualOnly render pixels whose alpha value is less than or equal to from AlphaValue. 只渲染alpha值<= AlphaValue的像素
EqualOnly render pixels whose alpha value equals AlphaValue. 只渲染alpha值=AlphaValue的像素
NotEqualOnly render pixels whose alpha value differs from AlphaValue. 只渲染alpha值不等于AlphaValue的像素
AlwaysRender all pixels. This is functionally equivalent to AlphaTest Off. 渲染所有像素相当于关闭alpha测试
NeverDon'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原创,转载请说明。

STM32的DMA模块及Protues仿真实验 (一)DMA简介      DMA(Direct Memory Access,直接存储器访问), 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。      STM32F407共有两个 DMA 控制器,总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理 一个或多 阅读详情

相关推荐

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 976

Unity烘焙AlphaTest材质阴影

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

糕二不二的博客 3441

深入解析TI C2000 ePWM模块:峰值电流模式Buck与LLC谐振变换器实战配置

脉宽调制(PWM)技术是电力电子与数字电源控制的核心,它通过调节开关信号的占空比或频率,实现对功率变换器输出电压、电流的精确控制。其基本原理是利用微控制器内部的定时器和比较器,生成具有特定时序的方波信号,驱动功率开关器件。这项技术的核心价值在于将复杂的模拟控制环路数字化,从而提升系统的可控性、灵活性和可靠性。在电机驱动、不间断电源(UPS)、服务器电源和新能源逆变器等广泛应用场景中,PWM技术都是实现高效能量转换的基石。本文聚焦于德州仪器(TI)C2000系列微控制器中功能强大的增强型PWM(ePWM)模块

weixin_30410119的博客 347

unity ShaderLab 基础之【透明测试AlphaTest】AlphaTest详解

一 基础介绍 1 透明度 当一个具有透明度的物体挡住另一个可见问题时,光线会穿过带有透明度的物体,使我们能看到后面那个物体的信息。一般情况吓alpha的值区间为(0-1),0为完全不可见,1为完全可见。 2 缓冲区 【颜色缓冲区】:也叫帧缓冲区,场景中的物体的像素都要写入该缓冲区,然后再渲染到屏幕上显示 【深度缓冲区】:用于记录颜色缓冲区中每个像素的深度值,通过深度缓冲区,我们可以通过深度测试来...

失业求捞! 5035

技术指南| 叶绿体基因组高级分析全流程解析

本文详细解析了叶绿体基因组高级分析的全流程,包括实验设计、序列组装与注释、比较基因组分析、选择压力与功能进化等关键步骤。通过实战案例和技术技巧,帮助研究者掌握叶绿体基因组分析的核心方法,提升植物进化研究和系统学分析的效率与准确性。

weixin_33725239的博客 492

Win11任务栏图标消失?快速恢复指南

任务栏图标消失是Windows 11操作系统中常见的问题之一,但通过上述方法,用户通常可以轻松解决这一问题。无论是重启Windows资源管理器、使用命令提示符修复、检查系统更新和设置,还是考虑重装系统,都可以帮助用户恢复任务栏图标的正常显示。希望本文的介绍能对用户有所帮助,让Windows 11的使用更加顺畅和愉快。

mmoo_python的博客 5411

Alpha Test 与 Alpha Blending

Alpha Test 与 Alpha Blending总结

sinat_34014668的博客 1756

XY2-100协议解析

1.XY2-100包括四路信号 : SENDCK(时钟信号)、SYNC(同步信号)、CHANNELX(X通道)、CHANNELY(Y通道)

qq_38360574的博客 9536

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

C#实战:如何用Bartender 10.1实现动态打印与批量打印(附完整源码)

本文深入探讨了如何在C#项目中高效集成Bartender 10.1,实现企业级的动态打印与批量打印功能。文章提供了从环境配置、COM接口精讲、高可用打印服务类封装,到批量打印性能优化及生产环境部署的全套实战方案与源码,帮助开发者构建健壮、可维护的打印解决方案。

weixin_29290963的博客 438

CorelDraw插件开发-Cdr插件-CPG插件-GMS插件-安装位置

文章目录1.gms格式插件2.cpg格式插件3.作者答疑   CorelDraw软件是一款使用非常广泛的矢量图形软件,系统本身提供了非常便利的二次开发环境,制作插件的格式有两种,一种是gms格式的脚本插件,另外一种是cpg格式dll插件。 1.gms格式插件   gms格式插件是使用微软的 VBA 技术,编写和调试都比较方便,从9的版本开始支持。   安装:把gms文件复制到程序所安装的目录 gms 下,一般在C:\Program Files\Corel\CorelDRAW Graphics Suite 1

插件开发 2760

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

【Bug已解决】npm install -g @anthropic-ai/claude-code 出现 EACCES: permission denied 解决方案

方案适用场景推荐指数nvm 管理 Node长期开发环境,一次配置永久生效⭐⭐⭐⭐⭐修改 npm 全局目录不想引入 nvm,快速解决⭐⭐⭐⭐修复现有目录权限之前用过 sudo 装包,需要修复⭐⭐⭐Windows 管理员/改目录Windows 平台专用⭐⭐⭐⭐官方原生安装脚本想彻底避开 npm 权限问题⭐⭐⭐⭐报的本质是npm 全局安装目录的属主权限与当前执行用户不匹配,而不是 npm 或 Claude Code 本身有问题。不要用sudo"强行"解决。

一键难忘的博客 1万+

Unity3D Shader官方教程翻译(四)

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

胡胜同学 1175

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Unity Shaders】Alpha Test和Alpha Blending

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

weixin_34381687的博客 891

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

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

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

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

execution.Welcome(you); 334

大学物理(英文版)笔记 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

Unity3d Shader篇(十二)— 透明度测试(AlphaTest)

在计算机图形学中,透明度测试(Alpha Test)是一种常用的技术,用于在渲染过程中根据像素的Alpha值进行裁剪或者过滤。通过透明度测试,可以实现在渲染物体时只显示符合一定透明度要求的像素,从而达到特定的视觉效果。本篇博客将介绍透明度测试在Shader中的应用。透明度测试是一种在渲染过程中根据像素的Alpha值进行裁剪或过滤的技术。在渲染物体时,每个像素都有一个Alpha值,用来表示其透明度。透明度测试通过比较像素的Alpha值与设定的阈值,来决定是否保留该像素或者丢弃该像素。

脚踏实地,实事求是。 2981
上一篇: Unity3D Shader官方教程翻译(九)----Shader语法:Pass的雾化处理
下一篇: Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值