【问题标题】:OpenGL - glBlendFuncOpenGL - glBlendFunc
【发布时间】:2019-01-31 04:54:45
【问题描述】:

我一直在努力寻找 glBlendFunc 内部工作背后的一些具体数学。

澄清一下,我知道混合方程是:

srcChannels * srcFactor + dstChannels * dstFactor = channelsRendered。

我的问题是,srcChannels、dstChannels和channels是渲染了3-vector(r,g,b)还是4-vector(r,g,b,a)?

由于 (0.2, 0.2, 0.2, 1.0) 和 (1.0, 1.0, 1.0, 0.2) 看起来应该相同,因此这里可能存在歧义。

【问题讨论】:

    标签: opengl glblendfunc


    【解决方案1】:

    glBlendFunc 适用于所有四个通道; glBlendFuncSeparate 将 RGB 与 alpha 分开。

    glBlendFunc reference page 描述了所有不同的混合模式以及应用于不同通道的操作。 glBlendFuncSeparate 做同样的事情,包括对 alpha 通道的操作。

    【讨论】:

    • 另外,openGL 将什么解释为来自 png 文件的完全透明像素? (0,0,0,0) 还是 (1,1,1,0)?
    • 我发现openGL将一个完全透明的像素解释为(1,1,1,0),这是为什么呢?有没有办法让它解释为(0,0,0,0)?
    • @MattPeck: "openGL 将一个完全透明的像素解释为来自 png 文件的什么?" 两者都不是; OpenGL 不会解释 PNG 文件。你 OpenGL任意像素数据; OpenGL 不知道也不关心它来自 PNG 文件。决定“透明”像素长什么样的是 PNG 解压缩器,而不是 OpenGL。
    • @MattPeck 您的问题并不完全合理。透明像素是透明的,因为它具有零 alpha 分量。因此,如果该像素是源颜色,并且您使用的是GL_SRC_ALPHA,则片段的颜色无关紧要。但是,我认为这不是你真正想要的。如果问题是 PNG 文件在您想要黑色时使用白色,您可以在着色器中重新映射它,或者如果您要进入史前时代,则可以使用 glPixelMap(如果是,请使用着色器)。这样做的原因是片段着色器在片段混合之前执行。
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2012-03-31
    相关资源
    最近更新 更多