【问题标题】:Making a Color Screen in OpenGL在 OpenGL 中制作彩色屏幕
【发布时间】:2012-11-30 00:45:57
【问题描述】:

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

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

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

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

蓝色物体 + 红色屏幕 = 灰色/黑色/白色物体

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

-编辑-

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

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

【问题讨论】:

  • how it would work... 的描述似乎很模糊。您能否将其表示为源和目标 RGB(A) 的函数?
  • 我已经用一些 RGB 值示例编辑了这个问题。希望这有助于解释我的问题。
  • 这对于片段着色器来说应该是一个相当简单的任务。
  • 据我所知,片段着色器正是我获取有关正在绘制的像素数据所需要的。至于实际更改我得到的东西的各个颜色值然后将它们发回?我似乎找不到任何东西。你有什么地方可以指点我吗?

标签: opengl colors filter screen


【解决方案1】:

您在寻找 glColorMask 吗?

看到这个答案:Render into a color channels without affecting other channels

我不清楚你的问题,但这会掩盖/隐藏选定的颜色通道: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 进行过滤,那么这正是您要寻找的。​​p>

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

【讨论】:

  • 虽然 glColorMask 提供的效果很酷,但这并不是我想要的。它只是阻止某些颜色通道被编辑,直到它们被启用。我需要的是停止 opengl 停止将某些颜色放到屏幕上。我需要消除场景中任意数量对象的两个 RGB 分量...
【解决方案2】:

我认为这最好由片段着色器处理。如果'filter'是一个常数值,你可以将它设置为一个uniform,例如,

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 函数更有用的内置选择。

【讨论】:

  • 根据我对着色器的了解,我很确定这就是我所需要的。您是否认为您可以向我指出(或自己给我)解释如何在程序主体中实现类似的东西?就像如果我希望过滤器绘制片段的红色组件,我会对您的示例做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多