【发布时间】:2017-05-16 16:25:44
【问题描述】:
我正在滥用 OpenGL 以使其以各种角度呈现对象的单个屏幕截图。我不需要 GUI 是交互式的;我只需要能够从控制台启动它并通过stdin 输入姿态信息。我需要它以这种方式工作,因为它将通过 Python 应用程序中的popen 调用。
不幸的是,当我使用std::cin 完成此操作时,给它\n 字符似乎不会导致它注册输入。相反,我必须按 Ctrl+D 跟随\n,这样我才能继续按预期提供额外的输入。
请注意,如果我在第一个输入(qw)上执行 Ctrl+D,它会按您的预期退出(由于 cin.eof() 出现 true)。
这种行为是可以接受的,除了it appears Python won't allow me to send a Ctrl+D to the OpenGL app without closing the stream entirely(不是我想要的)。我也尝试发送curses.ascii.EOT(传输结束字符,0x04)而不是(per this forum question),但这似乎也不起作用。
以下是相关代码:
glfwSwapBuffers(window);
std::cerr << "Waiting for input ? " << std::flush;
// priming read
std::cin >> qw;
/*
* Main event loop
*/
while (!std::cin.eof()) {
//glfwPollEvents(); // Seems to make no difference
std::cin >> qx;
std::cin >> qy;
std::cin >> qz;
object = glm::normalize(glm::dquat(qw, qx, qy, qz));
std::cerr << "Quaternion: " << object.w << ',' << object.x << ',' << object.y << ',' << object.z << std::endl;
scene.render(&shader_program, object, translation, sensor);
pixels = scene.projected_area(width, height);
projected_area = pixels * box_width * box_width / (double)(width * height);
std::cout << std::setprecision(17) << projected_area << std::endl;
glfwSwapBuffers(window);
// next priming read
std::cin >> qw;
}
glfwTerminate();
似乎这个特定的用例超出了人们通常使用 OpenGL 所做的事情。谁能解释发生了什么/告诉我如何让它表现得像我不使用 GLFW 时那样?
更新:我想知道这是否会发生,因为glfw opens multiple threads。甚至在我调用 any glfw 方法之前,我看到我的进程有五个线程:
$ ls -l /proc/16051/task
total 0
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16051
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16052
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16053
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16054
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16055
更新 2: 我已验证当我打开文件并从 ifstream 读取而不是从标准输入读取时会发生正常行为。我还注意到,当我在OpenGL 应用程序的控制台,我得到的反馈是 ^M 而不是换行符,即使我在 Linux 中。
【问题讨论】:
-
是什么让你认为这是 GLFW 的错?如果您使用常规控制台应用程序尝试此操作,它有效吗?另外,您使用的是什么操作系统?最后,我不认为检查 EOF 通常是处理此表单继续输入的最佳方式。
-
@NicolBolas 为什么这不适用于常规控制台应用程序?
>>运算符在cin上的行为由 C++ 标准定义。我不确定如何回应您关于 EOF 的声明,因为我明确尝试不将 EOF 用于行尾;我只是尝试使用 EOF 来检查输入的结尾,这是非常标准的用法。 -
@Cameron 如果这是问题所在,那么它在之前
glfwInit()被调用之前不会正常工作吗? -
默认是行缓冲的。
-
是什么让您认为这是“滥用 OpenGL”并且“人们通常不会这样做”?我一直使用 OpenGL 进行离屏渲染。唯一的区别是我使用 GLUT(可能没关系)并且我创建了一个 FBO 而不是使用(隐藏的)窗口帧缓冲区。尝试使用 FBO,不要拨打
glfwSwapBuffers。