我有一个批处理渲染管线,可将一堆四边形上载到OpenGL。将这些呈现给FBO。自然,附件中的一个是视觉输出,另一个是深度,允许进行后期处理等。但是,第三个附件旨在以与此处说明类似的方式存储要拾取的对象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;
}
}
丢弃片段是二进制的。它要么被丢弃(连同所有结果),要么被接受。
您也不能混合为非标准化的整数图像格式。混合仅在浮点类型(包括标准化整数)之间起作用。
最好的选择是对索引使用浮动图像格式。将整数转换为着色器,然后使用混合将其打开/关闭。这将需要vec4
在着色器中编写一个,以便您可以编写适当的alpha值。请注意,仅仅因为您正在编写a vec4
,并不意味着图像格式必须包含4个组成部分;它仍然可以具有1个组件,并且混合应该可以工作(只要您仅使用源Alpha)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句