0

我编写的一个 OpenGL 应用程序可以作为一个适当格式的大型数据文件的查看器。

这很简单,它一次遍历每个数据集,使用 glCallList 绘制每个数据集:

for (all objects in our in our data set)
{
    if (first time drawing this object)
    {
        glNewList(...);
        for (all pixels in object_memory)
        {
          drawpixel(); 
        }
        glEndList();
        glCallList(...);
        delete object_memory
    }
    else 
    {
        glCallList(...);
    }
}

我正在尝试添加一个功能,我可以在其中更改单个 glCallList 的透明度。问题是,数据文件太大了,我生成了 glCallList,然后必须删除我从中读取的实际数据。这使内存使用量从4GB下降到400MB左右。glCallLists 的使用对应用程序的速度也非常重要,如果没有它们,它会变得缓慢。

有没有办法在我实际调用列表之前修改当前矩阵的全局透明度?

每次需要更新 alpha 值时更新列表不是一种选择。

或者,是否有另一种具有与 CallLists 相同的性能优势但可以轻松更新的方法?

我之前读过 VBO(顶点缓冲区对象),它们听起来很相似,但我不确定我的数据是否适合应用程序域。

任何想法或意见都会受到重视。

谢谢,

〜布赖恩

4

1 回答 1

2

我能想到的最简单的修改 alpha 的通用方法是通过统一传递给顶点或片段着色器。

VBO 可能会有所帮助,但是如果没有更多关于您实际在做什么的信息,就很难判断...当您的顶点数量超过卡的带宽可以在一帧中处理时,VBO 的帮助 - 所以如果您有非常复杂的网格(例如高分辨率地形)它们可能是您正在寻找的东西。

(回复评论)听起来您的 DrawPixel 例程是在立即模式下实现的,这确实是低效的。尝试使用顶点数组而不是 glBegin()...glEnd() - 我敢打赌,你会看到很多与绘制列表相同的性能改进。

于 2009-05-31T03:02:58.087 回答