在现代OpenGL中,如何避免使用无效片段覆盖FBO颜色附件中的数据?

问题描述

我有一个批处理渲染管线,可将一堆四边形上载到OpenGL。将这些呈现给FBO。自然,附件之一是视觉输出,另一个附件是深度,允许进行后期处理等。但是,第三个附件旨在以类似于here的样式存储用于拾取的对象ID。>

有一个小问题。我希望某些渲染的项目对拾取是“透明的”。从本质上讲,某些东西(颗粒或视觉装饰或其他东西)本身是不可拾取的,但不应阻止对其背后物体的拾取。

这将如何实现?网络搜索表明glAlphaFunc可能曾经扮演过这个角色,因为我可以将对象id打包到带有透明度通道的纹理中,然后删除将透明度设置为0的所有片段。可行的。但是,那已经折旧了。

针对类似问题的另一个常见建议是使用discard关键字。这是行不通的,因为它会删除片段的所有输出元素,而不仅仅是删除指定的附件。

这里的解决方案是什么?我可以用看不见的混合功能做些聪明的事情吗?我很糊涂。


片段着色器看起来像这样:

#region Fragment

#version 440 core

layout(location = 0) out vec4 colour; // Visual
layout(location = 1) out uint interactLayer; // Picking

in vec2 texCoord;
in flat int texUnit;
in flat uint objectID;

uniform sampler2D[32] u_texData;

void main()
{
    vec4 c1 = fragmentColour * texture(u_texData[texUnit],texCoord);
    
    if (c1.w == 0.0f) { discard; }
    colour = c1;
    
    if (objectID == 0xffffffffu) {
        // Please don't write to interactLayer values,// but also please don't discard the 'colour' value.
    }
    else {
        interactLayer = objectID;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)