1

所以,我有一组我在 openGL 中制作的对象。它们每个都有自己的颜色,其中一些还应用了纹理。我想要做的是阻止某些颜色到达屏幕,但仍然能够改变它。有没有办法挑选出实际涂上的颜色?

我尝试在相机前放置一个半透明的平面,但它并不能阻止其他颜色通过——相反,它只是与它们混合。

理想情况下,它是这样工作的:

红色物体 + 红色屏幕 = 红色物体

蓝色对象 + 红色屏幕 = 灰色/黑色/白色对象

紫色物体 + 红色屏幕 = 红色物体

-编辑-

为了澄清我想要做的事情:我想让所有对象的 RGB 值保持不变。但是,在将它们绘制到屏幕上之前,我想在不对对象进行任何实际更改的情况下将某些颜色值“归零”。

因此,RGB [255,150,200] 通过红色滤镜的对象将被绘制为具有 RGB 值 [255,0,0]、绿色滤镜 [0,150,0] 和蓝色滤镜 [0,0,200]。

4

2 回答 2

1

您在寻找 glColorMask 吗?

看到这个答案:渲染成颜色通道而不影响其他通道

我不清楚您的问题,但这会掩盖/隐藏选定的颜色通道:R、G、B 或 A


鉴于这种

因此,RGB [255,150,200] 通过红色滤镜的对象将被绘制为具有 RGB 值 [255,0,0]、绿色滤镜 [0,150,0] 和蓝色滤镜 [0,0,200]

glColorMask 将起作用。

glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
drawMyRedFilteredStuff();
// Return open gl state back to normal function
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

如果您只需要按红色、绿色、蓝色或 alpha 进行过滤,那么这正是您要寻找的。

我仍然没有得到你想要做的事情吗?

于 2012-11-30T03:45:19.377 回答
0

我认为这最好由片段着色器处理。如果“过滤器”是一个常数值,您可以将其设置为统一,例如,

uniform vec3 filter_rgb;
in vec3 src_rgb;

out vec4 dst_rgba;

void main (void)
{
    dst_rgba = vec4(min(filter_rgb, src_rgb), 1.0);
}

因此,如果任何滤波器组件设置为零,则相应的输出组件也将为零。根据您想要的行为,clamp函数可能是内置函数比min函数更有用的选择。

于 2012-11-30T11:12:01.857 回答