【发布时间】:2013-01-17 00:48:34
【问题描述】:
我需要在运行时对 2700x1600 图像进行 alpha 混合。它本质上是一个幻灯片,虽然有多个“甲板”同时运行。此图中的每一列都代表任何时刻的程序状态:
imageA1 <-blend-> imageA2 <-blend-> imageA3 ...
imageB1 <-blend-> imageB2 <-blend-> imageB3 ...
imageC1 <-blend-> imageC2 <-blend-> imageC3 ...
imageD1 <-blend-> imageD2 <-blend-> imageD3 ...
imageE1 <-blend-> imageE2 <-blend-> imageE3 ...
imageF1 <-blend-> imageF2 <-blend-> imageF3 ...
毫不奇怪,我在保持帧速率方面遇到了问题。我尝试在屏幕外缓冲区上进行混合,但这似乎没有多大帮助。是否有任何通用策略来处理可能适用于这种情况的这么大的图像?也许可以尽可能地利用显卡?
这是我目前的基本策略(非常简化的代码,处理而不是 Java):
PImage a = loadImage("imageA.png");
PImage b = loadImage("imageB.png");
PGraphics buffer = createGraphics(width, height, OPENGL);
void draw () {
buffer.beginDraw();
buffer.tint(255, 200);
buffer.image(a, 0, 0);
buffer.tint(255, 100);
buffer.image(b, 0, 0);
buffer.endDraw();
image(buffer, 0, 0);
}
我正在使用 Java/Processing,但欢迎使用原始 JOGL 提供建议。
我在管理内存方面也遇到了一些麻烦;这些未压缩的图像中的每一个都是〜17MB(2700x1600x4字节),并且我将混合总共〜60张图像(不是同时进行!)。对于超出此问题范围的内存问题,我有一些策略,但我将其包括在此处,以防有一种巧妙的方法来平衡计算机内存和显卡之间的内存使用情况。
(额外信息,对于那些关心的人:我的理解是 Processing 的 image() 调用(将图像对象绘制到屏幕上)使用 JOGL 作为其底层实现。这种理解来自于查看 Processing 的 PGraphics.imageImpl() method 的源代码,当使用 PGraphicsOpenGL 渲染器(我是)时,最终会在 PGraphicsOpenGL.rawPolys() 内的本机 JOGL 调用中结束。)
【问题讨论】:
-
你能把这个问题分解一下吗?如果您对某个特定部分有困难,请专门发布一个关于它的问题,并附上您尝试过的部分。
-
必须是 Processing/Java 吗?这几乎是题外话,但你考虑过 MaxMSP/**Jitter** 吗?抖动矩阵非常快,如果需要,您可以使用 gl。如果补丁可视化编程范式是一个问题,您可以使用 C++、JavaScript 中的脚本或 Java 中的扩展 MaxObject(我记得 Max5 中就是这种情况,不确定 Max6 中是否仍然存在),但想法是 Jitter 处理得很快带像素
-
@GeorgeProfenza,是的,抖动是为这种事情量身定做的。不幸的是,这只是一个更大的应用程序的一个组件,并且不会发生抖动重写;)
标签: java gpu processing jogl