双源混合与多渲染目标链接错误
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 pnameMAX_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,这是一个非常常见的工作流程,但使用双源混合,这似乎是不可能的,这实际上是一个阻塞问题。以上是关于双源混合与多渲染目标链接错误的主要内容,如果未能解决你的问题,请参考以下文章