首页 > 解决方案 > 如何通过只发送一次数据使着色器褪色?

问题描述

我很难仅使用着色器将方形渐变为黑色。我正在使用结合 C++ 和 Qt 的 OpenGL。我需要做的是一次将顶点列表发送到 GPU,并且只有一个绘图调用。使用那个顶点列表,我需要正方形在一定时间内淡入黑色。这可以通过仅使用 OpenGL 着色器来实现吗?我不想在 CPU 端执行此操作,因为它是更大应用程序的一部分,并且速度极慢。如何在不发送新的褪色值的情况下使着色器褪色?

标签: openglshader

解决方案


淡出效果在片段着色器中很容易完成。

您在 CPU 中有一个计时器。每次触发时,您都会创建一个 var remainingPercent,表示您希望在窗口中看到多少全“白色”(而不是全黑)。让这个值在 [0, 1.0] 范围内。

每次计时器触发时,您只需绑定 VAO 并调用glDrawXX,无需再次填充缓冲区。并调用swapbuffers。

您通过 a 将此remainingPercent值传递glUniform给着色器。最后一步是将当前颜色与全黑按这种均匀的量混合。就像是:

float uniform fadeOut;
in vec4  fragColor;
out vec4 finalColor;
....
finalColor = mix(vec4(0.0), fragColor, fadeOut);

推荐阅读