在OpenGL中使用glCallList时修改alpha状态
我编写的OpenGL应用程序以适当的格式充当大型数据文件的查看器 这非常简单,它一次循环遍历每个数据集,使用glCallList绘制每个数据集:在OpenGL中使用glCallList时修改alpha状态,opengl,transparency,Opengl,Transparency,我编写的OpenGL应用程序以适当的格式充当大型数据文件的查看器 这非常简单,它一次循环遍历每个数据集,使用glCallList绘制每个数据集: for (all objects in our in our data set) { if (first time drawing this object) { glNewList(...); for (all pixels in object_memory) { dr
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。
glcalllist的使用对应用程序的速度也非常重要,没有它们,它的速度会慢到爬行
在我实际调用列表之前,是否有办法修改当前矩阵的全局透明度?
每次需要更新alpha值时更新列表不是一个选项
或者,是否有另一种方法具有与调用列表相同的性能优势,但可以轻松更新?
我以前读过VBO(顶点缓冲区对象),它们听起来很相似,但我不确定我的数据是否适合应用程序域
任何想法或意见都将受到重视
谢谢
~Brian我能想到的修改alpha的最简单通用方法是通过一个统一的顶点或片段着色器 VBO可能会有所帮助,但如果没有更多关于您实际正在做什么的信息,就有点难以判断。。。VBO的帮助是,当你的顶点比你的卡在一个帧中可以处理的带宽还多时——因此,如果你有非常复杂的网格(例如高分辨率的地形),它们可能就是你要寻找的
(回复评论)听起来你的DrawPixel例程是在即时模式下实现的,这是非常低效的。尝试使用顶点数组而不是glBegin()…glEnd()-我敢打赌,您将看到与绘制列表相同的性能改进。drawPixel只执行glBegin(GLU点);glVertex3d(x,y,z);格伦德();这些数据都在某种图像文件中,很难描述。只是xyz数据。面对类似的问题,我和Nathan在一起,着色器是一条出路。此外,如果可能,少打glBegin/glEnd电话。开始(点);Vertex3d()一千次;End();无论是在构建显示列表时,还是在调用显示列表时,都应该更快。片段着色器是最好的选择。只需3行GLSL,您就可以编写满足您需要的内容;glVertex();格伦德()。