大家好,今天小编来为大家解答以下的问题,关于深度透明混合技术解析,这个很多人还不知道,现在让我们一起来看看吧!
混合
该命令在设置的同时也会开启混合模式,只有开启后才能使用混合。
混合是逐个片段的操作。
常用语义:Blend Off 关闭混合
Blend SrcFactor DstFactor 打开混合并设置混合因子
混合SrcFactor DstFactor、SrcFactorA DstFactorA
BlendOp 混合操作
公式:Blend:目标颜色=片段的颜色乘以SrcFactor + 颜色缓冲区中的颜色乘以DstFactor
Factor 因子:一位:1
零:0
SrcColor:原始像素的颜色值
SrcAlpha:原始像素的值
DstColor:颜色缓冲区的颜色值
DstAlpha:颜色缓冲区的值
OneMinusSrcColor:1-原始像素的颜色值
OneMinusSrcAlpha:1-原始像素的a值
OneMinusDstColor:1 - 颜色缓冲区的颜色值
OneMinusDstAlpha: 1 - 颜色缓冲区的a 值
BlendOperation:添加:添加混合颜色
Sub:混合颜色的减法
RevSub:依次从目标颜色中减去原始颜色
Min:原始颜色和目标颜色各分量的最小值
MAX:原始颜色和目标颜色各分量的最大值
常用:Blend SrcAlpha OneMinusSrcAlpha 正常透明度混合
Blend OneMinusDstColor 一种软添加
代码如下:
着色器“AlphaBlend”
{
特性
{
_Color ("主色调", 颜色)=(1, 1, 1, 1)
_MainTex("纹理", 2D)="白色"{}
_AlphaScale("Alpha Scale", Range(0, 1))=1 //控制透明度
}
子着色器
{
标签
{
"Queue"="Transparent" //使用透明渲染队列
"IgnoreProjector"="True" //不受投影仪影响
"RenderType"="Transparent" //分类为透明组
}
详细程度100
经过
{
标签{ "LightMode"="ForwardBase" }
Z 注销
Blend SrcAlpha OneMinusSrcAlpha//SrcAlpha代表原始像素的a值,OneMinusSrcAlpha代表1-目标像素的a值
CG程序
#pragma 顶点vert
#pragma 片段片段
#include "UnityCG.cginc"
#include "Lighting.cginc"
结构体v2f
{
float4 顶点: SV_POSITION;
float2 uv : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
float3 worldPos : TEXCOORD2;
};
固定4_颜色;
采样器2D _MainTex;
float4 _MainTex_ST;
修复_AlphaScale;
v2f 垂直(appdata_base v)
{
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.uv=TRANSFORM_TEX(v.texcoord, _MainTex);
o.worldNormal=UnityObjectToWorldNormal(v.vertex);
o.worldPos=mul( unity_ObjectToWorld, v.vertex ).xyz;
返回o;
}
固定4 碎片(v2f i) : SV_Target
{
固定3 worldNormal=标准化( i.worldNormal );
fixed3 worldLightDir=标准化( UnityWorldSpaceLightDir(i.worldPos) );
固定4 texColor=tex2D( _MainTex, i.uv );
固定3反照率=texColor.rgb * _Color.rgb;
固定3环境=UNITY_LIGHTMODEL_AMBIENT.xyz *反照率;
固定3漫反射=_LightColor0.rgb * 反照率* max(0, dot(worldNormal, worldLightDir));
returnfixed4(ambient + diffusive, texColor.a * _AlphaScale);//叠加一个值
}
ENDCG
}
}
后备“透明/顶点光照”
}注意:当模型存在复杂遮挡关系时,会因排序错误而出现不正确的透明效果。
有两条通行车道可用。
第一个Pass开启深度写入,但不输出颜色。它仅将深度值写入深度缓冲区。
第二个通道进行正常的透明度混合,因为第一个通道已经在逐像素的基础上获得了正确的深度信息。
结果是:模型内部不会出现半透明效果,但模型和背景之间可以实现正常的混色。
代码如下:
.
经过
{
ZWrite On //启用深度写入
ColorMask 0 //设置颜色通道的写入掩码,0表示不写入任何颜色通道
}
.以及这种方法的缺点:浪费性能。
通常,透明效果需要双面渲染,因为默认引擎消除了对象的背面。
但透明度需要看到内部。
如果透明度混合需要开启双面渲染,则不能简单使用。
剔除
如果想要得到正确的透明效果,就必须保证正确的渲染顺序。
使用两个Pass 通道。
第一个仅渲染背面。
第二个仅渲染正面。
代码如下:
经过
{
.
剔除前线
.
}
经过
{
.
剔回
【深度透明混合技术解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这听起来很有趣!像水彩画的效果吗?
有10位网友表示赞同!
我觉得这样一来画面会更加柔和和梦幻!
有19位网友表示赞同!
是渲染技术上的新花样吗?
有8位网友表示赞同!
感觉这个效果应该可以用在很多领域,比如建筑设计啊。
有17位网友表示赞同!
想看看这个透明度混合用在动画上会是什么样子。
有16位网友表示赞同!
有点像玻璃的那种视觉效果吧!
有20位网友表示赞同!
会不会很考验美术的功力呢?
有15位网友表示赞同!
这种技术听起来很前卫,我期待看到具体的作品。
有6位网友表示赞同!
不知道这样做的画面会怎么看待光线呢?
有9位网友表示赞同!
是不是可以模拟出各种材质的感觉呢?
有19位网友表示赞同!
会不会让作品看起来比较轻盈?
有10位网友表示赞同!
这种透明度混合技术能不能用在日常生活中的东西里?
有13位网友表示赞同!
我脑海里想到的就是一些神奇的水晶感觉。
有14位网友表示赞同!
这个听起来很有研究价值,能更了解光线的运作方式吗?
有17位网友表示赞同!
感觉很酷炫!以后可以期待更多创新的视觉效果吧?
有13位网友表示赞同!
是不是会让作品更有层次感?
有6位网友表示赞同!
这种技术在未来的设计领域应该会有很大的应用。
有16位网友表示赞同!
让我想到一些透明的艺术品,比如用玻璃制作的雕塑。
有14位网友表示赞同!
可以想象一下不同颜色的透明组合的样子。
有19位网友表示赞同!
期待看到更多艺术家运用这种技术的作品!
有16位网友表示赞同!