opengl - 双源混合与多渲染目标链接错误
问题描述
我正在尝试使用双源混合来实现文本子像素。
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 的最佳方式是什么?
解决方案
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 月的情况是这样。
推荐阅读
- javascript - 使用 Array.prototype.includes 定位对象数组中的属性
- php - 自定义帖子类型获取 URL 循环短代码
- python - 我在 Spyder (Anaconda) 中的 ipython 控制台没有选择正确的 Windows 系统 PATH 环境变量
- javascript - d3.js - 对由数组控制的 .key 的调用次数
- javascript - 根据 parameterName 获取 parameterDescription
- c# - 将 esp8266 代码(部分)转换为 c/c++ 或 c#
- reactjs - How to include the same React app twice on the same page?
- c# - 如果我的用户与我的 AspNetCore webapp 上的所需角色相关联,为什么我会被禁止?
- java - 单例设计模式示例
- ruby-on-rails - ActiveStorage S3 文件上传未定义的关键字 content_type