技术美术知识学习3200:混合模式及剔除

学习教程来自:【技术美术百人计划】图形 3.2 混合模式及剔除

笔记

1. 什么是混合模式?

将当前已有颜色和即将绘制的颜色混合在一起的方式或算法。
语法:

代码说明
Blend Off关闭混合(默认)
Blend SrcFactor DstFactorcolor = shader输出颜色 * SrcFactor op GBuffer中的颜色 * DstFactor
Blend SrcFactor DstFactor, SrcFactorA DstFactorA同上,额外指定了Alpha通道的混合参数
BlendOp Value指定混合方式,默认ADD
BlendOp OpColor, OpAlpha同上,额外指定了Alpha
AlphaToMaskOn常用在开启MSAA的地表植被的渲染

2. 混合模式有哪些类型?

一些常见的混合,详见官方文档

Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency alpha混合
Blend One OneMinusSrcAlpha // Premultiplied transparency 预乘透明度
Blend One One // Additive 相加混合
Blend OneMinusDstColor One // Soft Additive 柔和相加混合
Blend DstColor Zero // Multiplicative 相乘混合 正片叠底
Blend DstColor SrcColor // 2x Multiplicative 2倍相乘混合

使用代码

Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha

3. 混合模式的实现方式

src当前颜色,dst缓冲区已有颜色,一些效果暂时调不出来(BlendOp为空的部分)

混合模式PS代码BlendOpSrcBlendDstBlend备注
AlphablendSrc.a * Src + (1.0 - Src.a) * DstADDSrcAlphaOneMinusSrcAlpha透明混合
Darkenmin(Src, Dst)Min--变暗
MultiplySrc * DstMultiply--正片叠底
ColorBurn1.0 - (1.0 - Dst) / SrcColorBurn--颜色加深
LinearBurnSrc + Dst - 1.0---线性加深
DarkerColor(Src.x + Src.y + Src.z < Dst.x + Dst.y + Dst.z) ? Src : DstMin--深色
Lightenmax(Src, Dst)Max--变亮
ScreenSrc * (1 - Dst) + Dst * 1ADDOneMinusDstColorOne滤色
ColorDodgeDst / (1.0 - Src)ColorDodge--颜色减淡
LinearDodgeSrc + DstADDOneOne线性减淡
LighterColor(Src.x + Src.y + Src.z > Dst.x + Dst.y + Dst.z) ? Src : DstLighten--浅色
Overlay(Dst < 0.5) ? 2.0 * Src * Dst : 1.0 - 2.0 * (1.0 - Src) * (1.0 - Dst)Overlay--叠加
SoftLight(Src < 0.5) ? Dst - (1.0 - 2.0 * Src) * Dst * (1.0 - Dst)
: (Dst < 0.25) ? Dst 000000+ (2.0 * Src - 1.0) * Dst * ((16.0 * Dst - 12.0) * Dst + 3.0)
: Dst + (2.0 * Src - 1.0) * (sqrt(Dst) - Dst)
SoftLight--柔光
HardLight(Src < 0.5) ? 2.0 * Src * Dst : 1.0 - 2.0 * (1.0 - Src) * (1.0 - Dst)HardLight--强光
VividLight(Src < 0.5) ? 1.0 - (1.0 - Dst) / (2.0 * Src) : Dst / (2.0 * (1.0 - Src))---亮光
LinearLight2.0 * Src + Dst - 1.0---线性光
PinLight(2.0 * Src - 1.0 > Dst) ? 2.0 * Src - 1.0 : (Src < 0.5 * Dst) ? 2.0 * Src : Dst---点光
HardMixfloor(Src + Dst)---实色混合
Differenceabs(Dst - Src)Difference--差值
ExclusionSrc + Dst - 2.0 * Src * DstExclusion--排除
SubtractSrc - DstReverseSubstratOneOne减去
DivideSrc / Dst---划分
HueDst = RGB2HSV(Dst);Dst.x = RGB2HSV(Src).x; return HSV2RGB(Dst);HSLHue--色相
SaturationDst = RGB2HSV(Dst); Dst.y = RGB2HSV(Src).y; return HSV2RGB(Dst);---饱和度
ColorSrc = RGB2HSV(Src);Src.z = RGB2HSV(Dst).z; return HSV2RGB(Src);---颜色
Luminosityfloat dLum = dot(Dst, float3(0.3, 0.59, 0.11));
float sLum = dot(Src, float3(0.3, 0.59, 0.11));
float lum = sLum - dLum;
float3 C = Dst + lum;
float minC = min(min(C.x, C.y), C.z);
float maxC = max(max(C.x, C.y), C.z);
if (minC < 0.0)
    return sLum + ((C - sLum) * sLum) / (sLum - minC);
else if (maxC > 1.0)
    return sLum + ((C - sLum) * (1.0 - sLum)) / (maxC - sLum);
else
    return C;
HSLLuminoslingity--明度

ColorBurn只支持OpenGL,DX不支持

遇到的问题:源码中的部分混合效果需要颠倒src和dst的位置。OpenGL下部分效果可以调出,但自带的枚举下SrcBlend和DstBlend失效

4. 剔除的实现方式

  1. 法线剔除:根据法线朝向进行剔除,Cull Off/Front/Back
  2. 面裁切:在片元阶段直接丢弃满足某些条件的像素,Clip(),在某些PowerVR机型上效率很低,最好在AlphaTest队列中使用

作业

实现常用的混合模式,并设计使用界面

基于3中的表格,增加了混合的配置界面,对于src和dst可调的开放了参数设置,并增加了预设值。对于失效的则不显示参数选择。正确性未知的不予显示。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值