在OpenGL中使用glCallList时修改alpha状态

时间:2009-05-31 00:30:39

标签: opengl transparency

我编写的OpenGL App充当了适当格式的大型数据文件的查看器。

这非常简单,它一次循环遍历每个数据集,使用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(顶点缓冲区对象)的内容,它们听起来很相似,但我不确定我的数据是否适合应用程序域。

任何想法或意见都会非常适合。

谢谢,

~Brian

1 个答案:

答案 0 :(得分:2)

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

VBO可能有所帮助,但是如果没有更多关于你实际在做什么的信息就很难说...当你有更多的顶点而不是卡的带宽可以在一个框架中处理时,VBO的帮助 - 所以如果你有非常复杂的网格(例如高分辨率的地形)它们可能就是你想要的。

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