创建一个片段着色器随着时间的推移使白色纹理变暗 – OpenGL GLSL

所以作为学习OpenGL的一部分,我现在决定尝试使用着色器来创造更多的创意,作为使用C / OpenGL的练习游戏的一部分。

在处理着色器方面,我是全新的,所以我仍然试图习惯于用它来创建一些东西。 就此而言,这是我想要尝试的。

作为游戏的一部分,游戏的整个背景由白色,简单的2D纹理组成。 随着时间的推移,白色的纹理应该慢慢地把黑色的圆圈变成animation,直到整个纹理完全变黑为止。

我已经考虑了一些不同的方法来解决这个问题,并且想知道哪一个对于着色器来说是最实用的。

使用帧缓冲区 :正如我从互联网上看到的一样,你不能真正地说,将某些颜色应用到片段着色器中特定的片段区域(如创建一个黑色圆圈),然后保存那些状态为下一帧的片段。 相反,我将不得不应用效果,并将纹理渲染到帧缓冲区,然后在下一帧再次使用它。 我可以不断地做这个缓慢地添加黑色圆圈的纹理。 问题是,这样做是否真的做了太多的工作? 还是会足够快? 据我所见,帧缓冲区通常用于后期处理整个场景帧的效果。 这不适用于整个场景,只适用于背景。 这种方法的优势在于,只需要处理一个纹理,处理起来相对简单。

用自己的片段着色器创建个别的圆形对象 :这是我想要做的另一个方法。 基本上,我没有在整个背景纹理上使用一个着色器,而是简单地产生纹理四边形,每个纹理四边形单独运行一个片段着色器,使用简单的百分比值input作为统一,随着时间推移纹理变黑。 这个解决scheme的缺点是,由于必须在运行时处理更多的对象,而不是简单地使用一个纹理,使得它变得更加复杂。 渲染时还需要处理更多的顶点。

在这两种方法中,我不知道真正的解决scheme是什么。 我想使用帧缓冲器的方法,但我不知道是否会“滥用”这种问题的技术与否。

或者也许还有另一种方法,我完全错过了,因为我是着色器的新手,在这种情况下,欢迎其他建议!

感谢大家的帮助 :)

这听起来像你所说的帧缓冲方法可以正常工作。 你只需要一个framebuffer,每帧会稍微修改一下,逐渐累积所有圈子的总结果。 这与经常使用帧缓冲区的方式有点不同 – 清除它们并在每一帧重新渲染它们 – 但这没什么大不了的。

第二种方法类似于粒子系统的工作方式。 只要你没有成千上万的圈子,它也可以正常工作,但你说得对,它确实需要更多的代码基础设施,并且有更多的移动部分,可以这么说。 (为了学习的目的,在某些时候实现第二种方法可能是一个很好的练习,因为它可以作为dynamic顶点缓冲区和实例化的介绍。)