【问题标题】:How to create a texture alpha, with white and black colors only, in GLSL?如何在 GLSL 中创建仅具有白色和黑色的纹理 alpha?
【发布时间】:2015-05-19 03:06:18
【问题描述】:

我希望重现此tutorial 的发光效果,如果我理解得很好,我们将第一张图像转换为“alpha 纹理”(黑白),并模糊 (rgb * a) 纹理。

如何创建这种 alpha 纹理,使某些颜色变为白色,而另一种变为黑色?我找到了这个:How to render a texture with alpha?,但我真的不知道如何使用这些答案。

谢谢

【问题讨论】:

    标签: glsl shader scenekit


    【解决方案1】:

    您似乎误解了该图表向您显示的内容。它实际上是一个纹理,但(a) 显示 RGB 颜色,(b) 显示 alpha 通道。 (c) 显示了将 RGB 乘以 A 时会发生什么。

    Alpha 实际上并不是“黑白”,它是一个抽象概念,数值范围介于 0.01.0 之间。为了让人类大脑理解它,它将其解释为黑色 (0.0) 和白色 (1.0)。实际上,alpha 是您想要的任何值,并且与颜色无关(尽管它可以用来做一些颜色)。

    Alpha 通道通常由后处理图像过滤器生成,该过滤器会寻找明显高于平均亮度的纹理区域。在现代图形引擎中使用 HDR,并且场景中任何颜色太亮而无法在监视器上显示的部分都是发光的候选者。这种辉光的强度取决于该点的光照比显示器所能显示的亮度。

    然而,在这种情况下,它似乎是人类创造的。将 alpha 通道想象成一个蒙版,一些艺术家看着 UFO 并决定在图 (b) 中出现的非黑色区域应该发光,因此分配了一个非零 alpha 值(alpha = 1.0 发光最亮)。


    顺便说一句,您不应该模糊 alpha 蒙版。您想模糊 RGB * A 的 结果。如果您只是模糊了 alpha 蒙版,那么这根本不像发光。这个想法是模糊 UFO 应该发光的发光部分,然后将其添加到基本 UFO 颜色之上。

    【讨论】:

    • 谢谢,所以 a) 和 b) 的混合纹理应该只创建一次,是用“缓冲区”完成的吗?我读到了使用 3 个缓冲区(颜色、深度、模板)的“帧缓冲区”,但现在有点混乱。假设我用新图像创建了一个“缓冲区”,我应该把这段代码放在哪里?我使用 SceneKit,材质可以关联一个着色器,这让我可以访问顶点和片段着色器,但我猜它们都会在每一帧被调用。
    • @Paul:不幸的是,您缺少很多基本的东西。在研究 OpenGL 3.0 / OpenGL ES 2.0 渲染管道时,您可能会搁置实现模糊滤镜和发光。我的意思是真的,您需要了解帧缓冲区对象、渲染缓冲区对象和纹理对象是什么才能正确实现发光/绽放过滤器。你可能会很幸运,从一堆教程中拼凑出足够多的工作着色器代码,但你确实需要先了解基础知识。
    • @Paul:关于你关于混合a)b) 的问题,如果你使用静态发光贴图(艺术家想出的),它会做一次。但是,现代图形引擎使用片段着色器中的图像处理过滤器动态地执行此操作。这肯定会使用帧缓冲区对象将片段着色器的结果存储在渲染缓冲区或纹理中来完成。你是对的,传统的帧缓冲区包含颜色、深度和模板(有时甚至是累积),但在现代 OpenGL 和 GL ES 中,你可以使用帧缓冲区对象定义自己的。
    • 谢谢,是的,我尝试了一点,但我可能改天再试一次,我在 gameDev 堆栈交换上打开了一个线程:gamedev.stackexchange.com/questions/96795/…,但我没有更多答案可以继续 :-)。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多