如何在GLSL中创建仅具有白色和黑色的纹理alpha?

如何在GLSL中创建仅具有白色和黑色的纹理alpha?,glsl,shader,scenekit,Glsl,Shader,Scenekit,我希望从中重现辉光效果,如果我理解得很好,我们将第一幅图像转换为“alpha纹理”(黑白),然后模糊(rgb*a)纹理 如何创建此alpha纹理,使一些颜色变为白色,另一些变为黑色?我发现了这个:但我真的不知道如何使用这些答案 谢谢看来您误解了图表所显示的内容。它实际上是一个纹理,但是(a)显示RGB颜色,(b)显示alpha通道(c)显示将RGB乘以A时发生的情况 Alpha实际上并不是“黑与白”,它是一个抽象概念,相当于0.0和1.0之间的一系列值。为了让人脑理解它,它将其解释为黑色(0

我希望从中重现辉光效果,如果我理解得很好,我们将第一幅图像转换为“alpha纹理”(黑白),然后模糊(rgb*a)纹理

如何创建此alpha纹理,使一些颜色变为白色,另一些变为黑色?我发现了这个:但我真的不知道如何使用这些答案


谢谢

看来您误解了图表所显示的内容。它实际上是一个纹理,但是
(a)
显示RGB颜色,
(b)
显示alpha通道<代码>(c)显示将RGB乘以A时发生的情况

Alpha实际上并不是“黑与白”,它是一个抽象概念,相当于0.01.0之间的一系列值。为了让人脑理解它,它将其解释为黑色(0.0)和白色(1.0)。实际上,alpha是你想要的任何东西,与颜色无关(尽管它可以用来改变颜色)

通常,alpha通道将由后处理图像过滤器生成,该过滤器查找亮度明显高于平均值的纹理区域。在现代图形引擎中,HDR被使用,场景中任何颜色太亮而无法显示在监视器上的部分都可能会发光。该辉光的强度来自于该点的照明亮度比监视器显示的亮度大多少

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



顺便说一句,您不应该模糊alpha遮罩。您想要模糊RGB*A的结果。如果您只是模糊了alpha遮罩,那么这将完全不像发光。想法是模糊不明飞行物发光部分,然后将其添加到基本不明飞行物颜色的顶部。

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