首页 > 解决方案 > 双源混合与多渲染目标链接错误

问题描述

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

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 的最佳方式是什么?

标签: openglglsl

解决方案


OpenGL 4.6 核心配置文件规范在第17.3.6.3 节“双源混合和多个绘制缓冲区”(强调我的)中声明:

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

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

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

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


推荐阅读