【问题标题】:OpenGL - Set frame buffer texture to fully transparentOpenGL - 将帧缓冲区纹理设置为完全透明
【发布时间】:2014-08-28 12:11:53
【问题描述】:

我正在尝试渲染一些文本,但目前我正在单独渲染每个字形,这既慢又无效。

因此我想改变系统,所以文本只是被渲染成一个单独的纹理一次,每当它改变时,然后该纹理应该在主渲染通道中渲染到屏幕上。

到目前为止一切顺利,但问题是,要将其绘制在主要场景上,我只有两个选择。我可以将特定颜色(例如绿色)指定为“透明”,使用该颜色清除文本的帧缓冲区纹理,绘制文本并随后使用着色器将结果渲染到主场景上,减去透明颜色。

虽然这样可行,但我无法再将那种颜色用于实际文本。

相反,我宁愿完全清除帧缓冲区纹理的 alpha(基本上得到无色、空白的石板)然后绘制文本,但这似乎不可能?

glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE);
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);

这样做只会应用指定的 rgb 值和 alpha 作为这些颜色的“强度”。在这种情况下,它根本不会做任何事情,因为颜色组件被禁用。但我需要更改帧缓冲区中纹理的 现有 alpha,而不使用 glDrawPixels(太慢)。

现在,我当然可以编写一个额外的着色器来将每个片段的 alpha 值设置为 0,但这似乎并不那么有效/快速。

处理此类问题的最佳方法是什么?

【问题讨论】:

  • 为什么需要清除 alpha?如果字形具有透明度,则应将其透明度值写入文本 FBO。

标签: c++ opengl framebuffer


【解决方案1】:

到目前为止一切顺利,但问题是,要将其绘制在主要场景上,我只有两个选择。我可以将特定颜色(例如绿色)指定为“透明”,使用该颜色清除文本的帧缓冲区纹理,绘制文本并随后使用着色器将结果渲染到主场景上,减去透明颜色。

你把整个事情复杂化了。如果您将文本/字形渲染为只有一个用作 Alpha 通道的通道的纹理,则会为您提供 glphys 形状。颜色以顶点属性的形式控制,并在渲染时与纹理中的 alpha 相结合。

如果您想要花哨,而不是将裸字形渲染到纹理,您可能希望生成一个有符号距离场图,以节省纹理大小,同时保留高质量的文本输出。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 2016-01-01
    • 2014-12-05
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多