【问题标题】:OpenGL's glBlendFuncOpenGL 的 glBlendFunc
【发布时间】:2013-10-13 18:39:33
【问题描述】:

OpenGL 的 glBlendFunc 中是否有办法放大目标 RGB? (即(10,50,5)到(20,100,10)

看来你唯一能做的就是添加源rgb(乘以

【问题讨论】:

  • 我不明白为什么混合渲染目标的操作应该管理颜色值的缩放。如果您想要缩放目标或源目标的 rgb 值,为什么不在生成输出的着色器中执行此操作?另外,请注意,除非您使用整数纹理,否则渲染目标的组件值(红色、绿色、蓝色、alpha)不会占据离散范围(例如从 0 到 255),而是会容纳从 0.0 到1.0.
  • @SirDigbyChickenCaesar:片段着色器无法访问目标帧缓冲区值。也许下一代 GPU 会引入一个称为“混合着色器”的新着色器阶段,但迄今为止,混合是一种硬连线操作。
  • @SirDigbyChickenCaesar:哦,在您建议使用 FBO 并在片段着色器中采购 FBO 颜色附件纹理之前:这不起作用:纹理不能绑定到纹理单元和FBO 同时进行。
  • 我并不是说您应该尝试在片段着色器中缩放先前绘制操作的颜色值。我的意思是,如果您希望任何绘制操作的颜色分量具有特定值(在此示例中,应用了“比例”),您可以在与该特定绘制操作关联的片段着色器中处理它。 (了解此绘制操作之前/之后的混合操作将如何影响产生的颜色值。)
  • 现在,如果您只是想在事后缩放颜色值,您可以在单个渲染目标(而不是后台缓冲区)上执行所有绘制/混合操作。然后,一旦这些操作完成,您将后台缓冲区绑定为绘制缓冲区,并将前面步骤中使用的渲染目标绑定到着色器程序中的采样器,该着色器程序将比例应用于颜色值。

标签: opengl glblendfunc


【解决方案1】:

如果您想将此混合功能用于所有绘制操作/所有对象(并且当然具有初始非零值),您可以做的是以指数方式解释颜色。想象一下颜色缓冲区中写入的内容是某个基数的指数,例如2,因此 添加 到指数实际上将 乘以 2 到您添加的幂。

如果您还没有这样做,那么您需要引入一个后处理步骤。在那里,您读取颜色值并将 2 乘以颜色的幂,这将为您提供最终颜色。

当然,初始值必须是对数。

但是,如果您只想为 一些 绘制操作(我希望只有场景中的最后一个)添加颜色,则必须进一步拆分过程:首先绘制“正常”内容,其中您使用正常的颜色混合。然后将颜色转换为对数刻度(您可以为此使用单独的纹理),将其用于下一个绘制操作,该操作应将颜色相乘(但您告诉 OpenGL 添加颜色),然后通过采用力量。

当然你也可以使用e作为底,在这种情况下你使用自然对数和exp函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多