opengl - 如何通过只发送一次数据使着色器褪色?
问题描述
我很难仅使用着色器将方形渐变为黑色。我正在使用结合 C++ 和 Qt 的 OpenGL。我需要做的是一次将顶点列表发送到 GPU,并且只有一个绘图调用。使用那个顶点列表,我需要正方形在一定时间内淡入黑色。这可以通过仅使用 OpenGL 着色器来实现吗?我不想在 CPU 端执行此操作,因为它是更大应用程序的一部分,并且速度极慢。如何在不发送新的褪色值的情况下使着色器褪色?
解决方案
淡出效果在片段着色器中很容易完成。
您在 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);
推荐阅读
- google-api-python-client - Google Vault API 中的搜索和导出
- javascript - 当我尝试从第一个 jsp 重定向到第二个 jsp 时,ajax 调用进入错误函数
- reactivesearch - 如何在响应式搜索中过滤 _source?
- angular - Angular 5 找不到自定义管道
- python - kubernetes python 观看流
- android - 对我的后端的请求失败
- c# - 将数组拆分为新数组并用空格打印它们
- r - 使用 viridis 的热图反转颜色
- javascript - 过期“cookies”和关闭功能的时间
- sqlalchemy - 如何在结果中将聚合添加为“虚拟列”?