混合闪烁的灯光

时间:2021-05-27 19:35:14

标签: vulkan blending

<块引用>

注意:我说glistening不要与绽放、发光或自发光混淆,它们是定义明确的混合技术。

我通过在最终图像上简单地混合屏幕外图像来模拟 2D 照明。我得到的实际上是应该得到的,而且看起来是正确的:

enter image description here

但我想混合看起来像中途(这是屏幕截图的片段):

enter image description here

我怎样才能通过混合实现朦胧的绽放发光效果

这是我迄今为止尝试过的:

使用这些混合设置将浅色四边形渲染为屏幕外图像:

srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
dstColorBlendFactor = VK_BLEND_FACTOR_ONE;
colorBlendOp = VK_BLEND_OP_ADD;
srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
alphaBlendOp = VK_BLEND_OP_ADD;

如果相关,屏幕外缓冲区的格式与最终图像的格式相同,后者在此开发机器 VK_FORMAT_R8G8B8A8_SRGB 上(但在其他客户端机器上可能会更改)。

然后使用此着色器将屏幕外图像叠加在最终图像上:

outColor = inAmbientLight + texture(lightImageSampler, inUV);

此步骤的管道具有以下混合设置:

srcColorBlendFactor = VK_BLEND_FACTOR_DST_COLOR;
dstColorBlendFactor = VK_BLEND_FACTOR_ZERO;
colorBlendOp = VK_BLEND_OP_ADD;
srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
alphaBlendOp = VK_BLEND_OP_ADD;

另外,我想知道 if()discard 在着色器中仍然非常昂贵吗?我见过一些使用 if() 的强光着色器。我宁愿避免这些。

我也尝试过使用 VK_BLEND_OP_HARDLIGHT_EXT,但我无法使 VK_EXT_blend_operation_advanced 扩展工作。这可能是正确的方式吗?

另外,我可能需要 HDR(或 16 位颜色通道)吗?请注意,我不想使用绽放/发光着色器。结果应该可以通过简单的混合简单地“模拟”模糊来实现,但是“过度曝光”,好像最终的叠加会“过度驱动”超出 0-255 范围的颜色,从而增强为白色闪烁的灯光。

我可以接受指向教程的指针或仅用于搜索的术语,我不希望其他人解决我的问题。我只需要朝着正确的方向轻推!感谢您的每一点帮助!

<块引用>

也欢迎更正,例如更好的标题或标签。

0 个答案:

没有答案