我正在使用openGL进行科学可视化,我试图创建一个 "彩色雾 "来说明一个多维领域。我希望颜色的色调能代表以下几点 方向 场的亮度和颜色的亮度,以对应于。强度 的领域。
我使用的是 GL_BLEND
与 glBlendFunc(GL_ONE, GL_ONE)
来实现我所创建的表面颜色的添加混合。问题是:在某些地方,颜色会变得饱和。比如说 (1, 0, 0) + (1, 0, 0) = (2, 0, 0),而当这一切呈现出来时,它就变成了 (1, 0, 0) 即 "溢出 "就这样被砍掉了)。而这不是我想要的处理方式。我希望通过保留色调和明度来处理溢出,即
(2, 0, 0) 应译为 (1, 0.5, 0.5) 即浅红色,红色的光度是 "纯 "红色的两倍)。
有什么方法可以用OpenGL实现这一点(或类似的)?
如果目标缓冲区的图像格式为归一化格式(如unsigned_byte),则输出到片段着色器的结果将被钳制为[0,1]。如果你使用的是浮点格式,那么输出就不会被夹紧。请看 搅拌 和 图像格式.
通过一个不支持混合的函数来混合目标缓冲区和颜色是很棘手的。一个可能的解决方案是使用shader程序和使用扩展 EXT_shader_framebuffer_fetch(获取).
此外,延长 KHR_blend_equation_advanced(高级) 增加了许多 "高级 "混合方程,如 HSL_HUE_KHR
, HSL_SATURATION_KHR
, HSL_COLOR_KHR
和 HSL_LUMINOSITY_KHR
.