SceneKit - 在着色器修改器中访问目标颜色以进行混合

Posted

技术标签:

【中文标题】SceneKit - 在着色器修改器中访问目标颜色以进行混合【英文标题】:SceneKit – access destination color in shader modifier for blending 【发布时间】:2018-03-29 11:10:35 【问题描述】:

有没有办法访问金属着色器修改器中的最后一个片段颜色(目标颜色),类似于GLES 中的gl_LastFragData

我的目标是使用着色器修改器执行自定义混合(SceneKit 的SCNBlendModes 不适用于我的情况)。目前我正在使用SCNTechnique 和 3 个通道(渲染目标、渲染源、组合)来实现这一点,这对我来说似乎是一个主要的矫枉过正 + 在不引入新通道的情况下很难有几个混合组。

SCNProgram 似乎不是一个选项,原因有几个(我正在使用PBR,镶嵌/细分;我想我现在宁愿坚持使用技术)。

我已尝试按照this answer 中的建议使用#extension GL_EXT_shader_framebuffer_fetch : require,但即使对 GLSL 着色器修改器也不起作用(我使用的是Xcode 9.0ios 11)。

我还偶然发现this wonderful gist 具有 SceneKit 的默认金属着色器实现,但似乎没有在那里执行混合。这让我想知道这是否就是我找不到任何目标颜色参考的原因:混合发生在其他地方。

SCNProgram 是除了SCNTechnique 暴行之外的唯一途径吗?

附注: 我发现在Metal 的上下文中唯一提到gl_LastFragData 是在Metal Shading Language Specification 的4.8 Programmable Blending 章中,如果我能以某种方式访问​​[[color(0)]] 或着色器修改器中的类似内容(如果这甚至是可能的)。

【问题讨论】:

我也想知道这个。你有想过这个吗? 这里也一样。有这方面的消息吗? 【参考方案1】:

我只是想检查一下您是否忽略了片段入口点?

在文档中它说:“在执行所有其他着色后,使用此入口点更改片段的颜色。”

我不确定这是否正是您访问“最后一个片段颜色”的意思,但我认为这可能值得一提。

https://developer.apple.com/documentation/scenekit/scnshadermodifierentrypoint/1523342-fragment

【讨论】:

以上是关于SceneKit - 在着色器修改器中访问目标颜色以进行混合的主要内容,如果未能解决你的问题,请参考以下文章

将 Metal 缓冲区传递给 SceneKit 着色器

在纹理的SceneKit绘画与纹理坐标

iOS10 + SceneKit:使用自定义着色器渲染视频

带有 SceneKit SCNProgram 的金属着色器

iOS 14 解决方法中的 SceneKit Metal 着色器编译性能错误

如何为 SceneKit 预编译 PBR 着色器?