Unity3D- BlendOp 逻辑或

Unity3D- BlendOp LogicalOr

长话短说,我有一个绝对 具有 的着色器,可以使用 逻辑或 混合。我在一个着色器中对数据进行位打包,其中像素重叠,将此数据组合到输出 RenderTexture 中,然后在另一个着色器中将其解包。

这需要跨平台。我想支持 DX11/12(工作正常的地方)、OpenGL(标准、核心和 ES),理想情况下是 Vulkan 和 Metal。

事情是这样的。

Unity claims 它只能在 DX11 的特定子集中使用逻辑或混合。它实际上似乎适用于所有版本的 DX11.1+ 和 DX12。但是,它不适用于任何其他平台。

OpenGL 列出了对逻辑 OR 混合的支持 in their spec。看来这应该适用于 2 以上的所有 OpenGL 版本(包括 ES,除非我错过了什么)。

如何在 Unity 中将此着色器交叉编译为 GLSL,并启用此混合操作?我假设 P/Invoking glEnable 和相关函数的库可能是可能的,但我想知道是否有一种方法可以在 Cg 着色器上编写并正确地交叉编译。 Metal/Vulkan 不是交易破坏者,扩展支持会很好,但我非常乐意满足于仅支持 DX11+ 和 OpenGL 2+。

所以,最终我想做的事情在大多数移动系统上是不可能的。这主要是希望扩大我的潜在客户群,但我认为额外的复杂性不值得,因此我暂时放弃了移动支持。

但是,此设置可以在 DX11.1+、DX12、OpenGL 3.0+、OpenGL Core 和 Vulkan 上运行。您需要为 Unity 创建一个原生插件,并手动绑定所有渲染资源。我无法使 P/Invoke 方法起作用,因为没有公开的方法将它们与渲染上下文同步。无论如何,我确实想这样做以消除 Unity 的网格互操作成本,因此被迫这样做可能是一件好事。无论如何,我想 post 回到这里,让任何人在未来尝试类似的东西,并说这似乎是使用本机插件的唯一方法。