微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合闪烁的灯光

如何解决混合闪烁的灯光

注意:我说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 范围的颜色,从而增强为白色闪烁的灯光。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。