Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中使用glCallList时修改alpha状态_Opengl_Transparency - Fatal编程技术网

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

在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

我编写的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。 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();格伦德()。