双源混合与多渲染目标链接错误

Posted

技术标签:

【中文标题】双源混合与多渲染目标链接错误【英文标题】:Dual Source Blending with Multiple Render Target link error 【发布时间】:2020-12-24 06:40:00 【问题描述】:

我正在尝试使用双源混合实现文本子像素。

https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_blend_func_extended.txt

layout(location = 0, index = 0) out vec4 fragColor;
layout(location = 0, index = 1) out vec4 srcColor1;

void main()

  vec4 scolor0;
  vec4 scolor1;

  // some calulcations

  fragColor = scolor0;
  srcColor1 = scolor1;

它工作正常。 但现在我想写到另一个渲染目标 喜欢

layout(location = 0, index = 0) out vec4 fragColor;
layout(location = 0, index = 1) out vec4 srcColor1;
layout(location = 1) out uvec4 myMRT;

我尝试更改 location = 1 或 location = 2 但无论哪种情况,我都会收到此链接错误

错误:片段着色器在偏移处的程序集编译错误

错误:使用双源输出时颜色输出过多

在双源混合的情况下使用 MRT 的最佳方式是什么?

【问题讨论】:

【参考方案1】:

第 17.3.6.3 节“双源混合和多个绘制缓冲区”(强调我的)中的 OpenGL 4.6 core profile specification 状态:

需要第二个颜色输入的混合函数 (Rs1;Gs1;Bs1;As1) (SRC1_- COLOR, SRC1_ALPHA, ONE_MINUS_SRC1_COLOR, 或 ONE_MINUS_SRC1_ALPHA) 可能会消耗原本可以用于渲染到多个绘图缓冲区的硬件资源。因此,抽奖次数 可以附加到帧缓冲区的缓冲区在使用时可能会更低 双源混合。

使用双源混合函数时,可以附加到单个帧缓冲区的最大绘制缓冲区数是 依赖于实现,可以通过调用GetIntegerv查询 with pname MAX_DUAL_SOURCE_DRAW_BUFFERS. 使用双源时 混合,MAX_DUAL_SOURCE_DRAW_BUFFERS 应该用来代替 MAX_DRAW_BUFFERS 确定绘制缓冲区的最大数量 可以附加到单个帧缓冲区。 价值 MAX_DUAL_SOURCE_DRAW_BUFFERS 必须至少为 1。

(您提到的较旧的ARB_blend_func_exteded 扩展使用不同的措辞,但也只保证MAX_DUAL_SOURCE_DRAW_BUFFERS 的最小值为1)

因此,即使使用最新的 GL 规范,也不需要 GL 实现来支持具有多个渲染目标的双源混合。查看当前的report for that capability on gpuinfo.org 表明,没有实字实现支持大于 1 的值。所以不,你不能这样做。至少 2020 年 12 月的情况是这样。

【讨论】:

在我的超级着色器中,我想在着色器选项下附加 MRT,这是一个非常常见的工作流程,但使用双源混合,这似乎是不可能的,这实际上是一个阻塞问题。

以上是关于双源混合与多渲染目标链接错误的主要内容,如果未能解决你的问题,请参考以下文章

爬过链接时出现scrapy错误[关闭]

Django 2.0 - 渲染错误的模板(没有错误)

链接器错误 - 目标 C

在 QGLFramebufferObject 上渲染时错误的 alpha 混合

Apple Mach-O 链接器错误,目标 C

为 iOS 构建 OCUnit 应用程序测试目标时出现链接器错误