我有一个程序模拟随时间变化的物理系统.我希望以预定的间隔(例如每10秒)输出模拟状态到文件的可视化.我想以这样的方式做到这一点,即很容易"关闭可视化"而根本不输出可视化.
我正在将OpenGL和GLUT作为图形工具来进行可视化.然而问题似乎是,首先,它看起来只是输出到窗口而无法输出到文件.其次,为了生成可视化,您必须调用GLUTMainLoop并停止执行main函数 - 从那时起调用的唯一函数是来自GUI的调用.但是我不希望这是一个基于GUI的应用程序 - 我希望它只是一个从命令行运行的应用程序,它会生成一系列图像.有没有办法在GLUT/OpenGL中执行此操作?或者OpenGL完全是错误的工具,我应该使用别的东西
当我第一次加载对象时,我使用max和min(x,y,z)点计算初始AABB.但这是在物体空间中,物体在世界各地移动,更重要的是旋转.
每次翻译/旋转对象时,如何重新计算新的AABB?基本上每一帧都会发生这种情况,每帧重新计算新的AABB会是一次非常密集的操作吗?如果是这样,那会有什么选择呢?
我知道AABB会使我的碰撞检测不太准确,但实现碰撞检测代码比OBB更容易,我想一次采取这一步骤.
从以下答案中获得一些见解后,这是我当前的代码:
typedef struct sAxisAlignedBoundingBox {
    Vector3D bounds[8];
    Vector3D max, min;
} AxisAlignedBoundingBox;
void drawAxisAlignedBoundingBox(AxisAlignedBoundingBox box) {
    glPushAttrib(GL_LIGHTING_BIT | GL_POLYGON_BIT);
    glEnable(GL_COLOR_MATERIAL);
    glDisable(GL_LIGHTING);
    glColor3f(1.0f, 1.0f, 0.0f);
    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[0].x, box.bounds[0].y, box.bounds[0].z);
        glVertex3f(box.bounds[1].x, box.bounds[1].y, box.bounds[1].z);
        glVertex3f(box.bounds[2].x, box.bounds[2].y, box.bounds[2].z);
        glVertex3f(box.bounds[3].x, box.bounds[3].y, box.bounds[3].z);
    glEnd();
    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[4].x, box.bounds[4].y, box.bounds[4].z);
        glVertex3f(box.bounds[5].x, box.bounds[5].y, box.bounds[5].z);
        glVertex3f(box.bounds[6].x, box.bounds[6].y, box.bounds[6].z);
        glVertex3f(box.bounds[7].x, box.bounds[7].y, box.bounds[7].z);
    glEnd();
    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[0].x, box.bounds[0].y, box.bounds[0].z);
        glVertex3f(box.bounds[5].x, box.bounds[5].y, box.bounds[5].z);
        glVertex3f(box.bounds[6].x, box.bounds[6].y, box.bounds[6].z);
        glVertex3f(box.bounds[1].x, box.bounds[1].y, box.bounds[1].z);
    glEnd();
    glBegin(GL_LINE_LOOP);
        glVertex3f(box.bounds[4].x, box.bounds[4].y, box.bounds[4].z);
        glVertex3f(box.bounds[7].x, box.bounds[7].y, box.bounds[7].z);
        glVertex3f(box.bounds[2].x, box.bounds[2].y, box.bounds[2].z);
        glVertex3f(box.bounds[3].x, …我有一个任务是在C++中为Window和Linux实现屏幕外OpenGL渲染器.我已经使用LWJGL lib用Java编写了这样的版本.我使用了PBuffer对象,它根据使用的OS创建了Pbuffers.首先我想到的重新实现完整的PBuffer创建逻辑就像我在LWJGL的原生源中完成一样.然后我在StackOverflow.com上阅读这篇文章,建议使用标准上下文创建,让我们说使用GLFW(这是跨平台)但是不要创建实际的窗口.这是正确的方法吗?在这种情况下使用Pbuffer的利弊是什么?
更新: 我只想强调我使用FBO渲染帧,所以我的问题不在于如何在屏幕外模式下渲染,而是如何在Windows和Linux操作系统中创建没有窗口的上下文.
我想知道是否有可能在Qt中渲染OpenGL场景并实时将其流式传输到HTML5界面(我的意思是场景是在现场生成的).
我一直试图找到有关它的信息以及如何做到但我没有成功......
如果存在,是否存在任何类型的现有机制来压缩图像并优化带宽使用.我正在考虑像Citrix这样的解决方案,但使用HTML5客户端.
我需要使用OpenGL在屏幕外渲染相当多的(数万个)图像.
我在Windows下运行并使用QT作为框架.解决方案可以只是Windows,它并不重要.
从我发现使用Google的内容来看,有很多选项可以做到这 一点.这篇看似相当过时的文章提出了几种方法,其中相关的方法是:
CreateDIBSection并以某种方式将纹理绑定到它.该线程(消息6)建议使用QT特定的方式QGLWidget::renderPixmap
我的问题是 - 哪一个是最快的方式?pbuffers似乎是最安全的赌注,因为它保证在硬件上执行但不使用CreateDIB方法也通过硬件?QT方法怎么样?这个似乎存在一些上下文创建问题.当然我不想为我创建的每个图像创建新的上下文.
有没有人对此有一些很好的经验?
编辑:回答评论 - 
我有一个不变的场景,我从许多不同的角度渲染它.现在,图像将返回给用户,并由CPU处理.可能在未来它们将在GPU上进行处理.
为了对绘制的内容执行查询,我想渲染几个(可能是数千个)场景.我glGetQueryObjectiv()遇到的问题是调用是昂贵的,所以我想找到一种方法来提前渲染几个场景,同时我等待查询的结果可用.
我已经阅读了一些关于帧缓冲对象和像素缓冲对象的内容,但主要是在使用保存到文件的上下文中glReadPixels(),我无法找到在异步查询中使用这些对象中的任何一个的示例.是否有任何理由说明执行的设置与此示例中的glGetQueryObjectiv()不同(例如,我应该使用FBO还是PBO)?glReadPixels()
注意: 这不适用于图形应用程序.我感兴趣的只是GL_SAMPLES_PASSED查询的结果(即绘制了多少像素?).
具体应用是估计当其他表面投射阴影时阳光照射到表面的程度.如果您有兴趣,可以在这里阅读.
视窗
使用 glew
我正在尝试渲染离屏并将渲染的 img opengl 保存到 png 文件。
我在 stackoverflow 上关注了一个评价很高的答案: How to render offscreen on OpenGL?
但我得到的png文件只是黑屏。
这是我的相关代码:
glutCreateWindow(argv[0]);
if(GLEW_OK!=glewInit())
{
    return -1;
}
initScene();
GLuint fbo, render_buf;
glGenFramebuffers(1,&fbo);
glGenRenderbuffers(1,&render_buf);
glBindRenderbuffer(GL_RENDERBUFFER,render_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, viewport.w, viewport.h);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
//Before drawing
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glClear(GL_COLOR_BUFFER_BIT);               // clear the color buffer
glMatrixMode(GL_MODELVIEW);                 // indicate we are specifying camera transformations
glLoadIdentity();                       // make sure transformation is "zero'd"
//draw...
//glBegin(GL_POINTS) glColor3f, glVertex2f
//glFlush();
glFinish();
/*glutDisplayFunc(myDisplay);
glutPostRedisplay();*/
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
savePNG(outputPNGName,0,0,viewport.w,viewport.h);
//At deinit:
glDeleteFramebuffers(1,&fbo); …我是 PYopenGL 的新手,实际上,我也不确定 PYopenGL 是否适合我的任务。
我有一个 Wavefront obj 文件格式的 3D 模型。我需要从给定的视图中获取模型的“打印屏幕”。换句话说,我需要渲染模型而不是显示模型将其保存为图像(jpg)
我的想法是使用 PYopenGL 来完成这项任务。但是,谷歌搜索我找不到如何做到这一点的建议或示例。因此,我开始怀疑 PYopenGL 是否适合我的任务。
你们中有人已经有了这样的东西,或者知道一个我可以用来学习的例子吗?
提前致谢。
道
opengl ×7
c++ ×3
3d ×1
aabb ×1
asynchronous ×1
framebuffer ×1
glew ×1
glut ×1
graphics ×1
html5 ×1
image ×1
off-screen ×1
performance ×1
pyopengl ×1
python ×1
qt ×1
rendering ×1
wavefront ×1