我编写的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
答案 0 :(得分:2)
我可以想到修改alpha的最简单的通用方法是通过传递给顶点或片段着色器的统一。
VBO可能有所帮助,但是如果没有更多关于你实际在做什么的信息就很难说...当你有更多的顶点而不是卡的带宽可以在一个框架中处理时,VBO的帮助 - 所以如果你有非常复杂的网格(例如高分辨率的地形)它们可能就是你想要的。(回复评论)听起来像你的DrawPixel例程是在立即模式下实现的,这实在是效率低下。尝试使用顶点数组而不是glBegin()... glEnd() - 我敢打赌你会看到很多与绘制列表相同的性能提升。