Vb.net OpenGL保存渲染供以后使用

Vb.net OpenGL保存渲染供以后使用,vb.net,opengl,3d,3d-modelling,opentk,Vb.net,Opengl,3d,3d Modelling,Opentk,这是一个相当初级的问题,但鉴于我在OpenGL中渲染了一个复杂的形状,需要进行大量计算,如果您不再编辑它,是否有必要将其导出到一个类似于模型的状态,以便以后可以再次打开它 我不能在程序外创建它们(使用类似Blender的东西),因为形状是在程序启动时计算的。然后,渲染将被平移、旋转、绘制等。请注意,虽然我不需要编辑形状,但我确实希望它处于3D状态,因此保存图像不是一个选项 我使用的是OpenTK 1.0、VB.NET(.NET 4)很明显,可能是将顶点写入文件,然后在需要时重新加载它们。除非您有

这是一个相当初级的问题,但鉴于我在OpenGL中渲染了一个复杂的形状,需要进行大量计算,如果您不再编辑它,是否有必要将其导出到一个类似于模型的状态,以便以后可以再次打开它

我不能在程序外创建它们(使用类似Blender的东西),因为形状是在程序启动时计算的。然后,渲染将被平移、旋转、绘制等。请注意,虽然我不需要编辑形状,但我确实希望它处于3D状态,因此保存图像不是一个选项


我使用的是OpenTK 1.0、VB.NET(.NET 4)

很明显,可能是将顶点写入文件,然后在需要时重新加载它们。除非您有特定的理由不这样做,否则最好使用现有的多种文件格式之一,例如Ogre3d文件。

显而易见的可能性是将顶点写入文件,然后在需要时重新加载它们。除非您有特定的理由不这样做,否则最好使用现有的多种文件格式之一,例如Ogre3d文件。

这听起来是OpenGL显示列表的理想情况。使用它们的方法是首先向OpenGL请求要使用的显示列表id:

GLuint draw_id = glGenLists(1);
(您可以一次请求几个连续的ID,但在这种情况下,我们只请求1个) 然后,第一次通过绘制例程调用glNewList:

glNewList(draw_id, GL_COMPILE);
<do compute intensive drawing here>
glEndList();
glNewList(绘制id,GL编译);
格伦德利斯();
请注意,这实际上不会渲染您的形状(您可以在glNewList中使用GL_COMPILE_和_EXECUTE,这将渲染您的形状,但通常不建议这样做)

现在,无论何时需要绘制对象:

< set up your OpenGL matrices >
glCallList(draw_id);
<设置OpenGL矩阵>
glCallList(绘制id);
最后,当您完成它时,您可以使用GLDeleteList

显示列表实际上可以加快渲染速度,因为可以进行一些优化,并且消除了所有函数调用开销


现在,从技术上讲,OpenGL显示列表在OpenGL 3.0及更高版本(以及glTranslate、glVertex、glBegin…grrr)中已被弃用(但未被删除!),但在可预见的未来,它们仍然可以工作。为了便于将来使用,您应该使用顶点数组,但这要复杂一些。

这听起来是OpenGL显示列表的理想情况。使用它们的方法是首先向OpenGL请求要使用的显示列表id:

GLuint draw_id = glGenLists(1);
(您可以一次请求几个连续的ID,但在这种情况下,我们只请求1个) 然后,第一次通过绘制例程调用glNewList:

glNewList(draw_id, GL_COMPILE);
<do compute intensive drawing here>
glEndList();
glNewList(绘制id,GL编译);
格伦德利斯();
请注意,这实际上不会渲染您的形状(您可以在glNewList中使用GL_COMPILE_和_EXECUTE,这将渲染您的形状,但通常不建议这样做)

现在,无论何时需要绘制对象:

< set up your OpenGL matrices >
glCallList(draw_id);
<设置OpenGL矩阵>
glCallList(绘制id);
最后,当您完成它时,您可以使用GLDeleteList

显示列表实际上可以加快渲染速度,因为可以进行一些优化,并且消除了所有函数调用开销


现在,从技术上讲,OpenGL显示列表在OpenGL 3.0及更高版本(以及glTranslate、glVertex、glBegin…grrr)中已被弃用(但未被删除!),但在可预见的未来,它们仍然可以工作。为了保证将来的安全,您应该使用顶点数组,但这要复杂一点。

他们到底为什么总是不喜欢所有东西?我会尝试一下你的方法,看看它的用途,但出于好奇,在OGL3中显示列表的替代方案是什么?好吧,从我所知道的,在OpenGL 3.0及更高版本中,所有顶点数据都应该放在顶点缓冲区对象中,纹理数据应该放在像素缓冲区对象中。所有变换(如glRotate)都将由顶点着色器程序替换。原因似乎是所有高性能OpenGL程序都已经(大部分)做到了这一点,但我确实认为这大大提高了初学者或编写简单图形应用程序的门槛。作为一名可视化实验室的图形程序员,我没有立即放弃OpenGL 2.1的计划,尽管有一天我可能会被迫放弃。他们到底为什么总是不赞成一切?我会尝试一下你的方法,看看它的用途,但出于好奇,在OGL3中显示列表的替代方案是什么?好吧,从我所知道的,在OpenGL 3.0及更高版本中,所有顶点数据都应该放在顶点缓冲区对象中,纹理数据应该放在像素缓冲区对象中。所有变换(如glRotate)都将由顶点着色器程序替换。原因似乎是所有高性能OpenGL程序都已经(大部分)做到了这一点,但我确实认为这大大提高了初学者或编写简单图形应用程序的门槛。作为可视化实验室的图形程序员,我没有立即放弃OpenGL2.1的计划,尽管有一天我可能会被迫放弃。