【问题标题】:Grayscale blending with OpenGL?与OpenGL的灰度混合?
【发布时间】:2010-10-25 01:41:31
【问题描述】:

有没有办法设置混合参数,使整个场景呈现灰度? (不使用 GLSL,仅使用管道函数)

谢谢

【问题讨论】:

    标签: c++ c opengl


    【解决方案1】:

    不,所有颜色都是分开的。你需要一个像素着色器

    【讨论】:

      【解决方案2】:

      嗯,如果渲染成luminoscity+alpha FBO,然后画出来?

      好吧,要么复制到这样的纹理,然后将纹理返回到 FBO - 也就是说,在大多数情况下,FBO 将是更好的解决方案(如果可用)。

      请注意,我没有对此进行测试。

      【讨论】:

      • 这样的FBO可以创建吗?
      • 也许你可以渲染成亮度+alpha纹理
      • 是的,这就是我的意思——FBO 基本上就是这样,渲染到纹理。如果失败,请尝试正常的复制到纹理,然后复制回帧缓冲区。一旦我开始使用它,我应该自己尝试一下......哦,可能需要也可能不需要 alpha,这取决于您的要求。
      【解决方案3】:

      实际上,为了完整起见,我会提到如果支持 GL_ARB_imaging 扩展,则有一种可能的解决方案:GL_COLOR_MATRIX,它可以转换传入的 RGBA 值。您可以将上面的 3x3 矩阵设置为全部 1/3.0,如下所示:

      GLFloat graymat[] = {.33,.33,.33,0,.33,.33,.33,0,.33,.33,.33,0,0,0,0,1};
      glMatrixMode(GL_COLOR_MATRIX)
      glLoadIdentity()
      glMultMatrixf(graymat)
      

      尽管这听起来很棒,但并非所有驱动程序都支持硬件,这意味着根据您的 opengl 实现,您的驱动程序可能:A)完全忽略颜色矩阵,B)回退到软件渲染,或 C )(如果不支持扩展)引发 GLError。

      如果您正在为一组有限的平台编写代码,并且它们支持此扩展,那么这将是最简单的方法。否则,您将需要另一种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2015-07-03
        • 1970-01-01
        相关资源
        最近更新 更多