无法在 GLEW 应用程序中将 OpenGL 缓冲区打印到控制台
Posted
技术标签:
【中文标题】无法在 GLEW 应用程序中将 OpenGL 缓冲区打印到控制台【英文标题】:Can't print OpenGL buffer to console in a GLEW application 【发布时间】:2012-11-13 21:41:20 【问题描述】:我正在使用here 找到的教程。我正在使用 GLFW。我的窗口加载正常,但调用时
GLuint vertexBuffer;
glGenBuffers( 1, &vertexBuffer );
printf( "%u\n", vertexBuffer );
它没有写入控制台,如果我关闭 openGL 窗口它会中断(如果我关闭控制台则不会)。我猜是指针有问题?但这对我来说似乎是正确的,这正是他在教程中的做法。
这是我的整个非常小的 .cpp (VS2012):
#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/glfw.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment( lib, "glfw.lib")
#pragma comment( lib, "opengl32.lib")
#pragma comment( lib, "glew32s.lib")
int main()
glfwInit();
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 2 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
glfwOpenWindow( 800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW );
glfwSetWindowTitle( "OpenGL" );
printf("This works");
while( glfwGetWindowParam( GLFW_OPENED ) )
glfwSwapBuffers();
glewExperimental = GL_TRUE;
glewInit();
GLuint vertexBuffer;
glGenBuffers( 1, &vertexBuffer );
printf( "%u\n", vertexBuffer );
glfwTerminate();
exit( EXIT_SUCCESS );
【问题讨论】:
尝试在 printf 后添加fflush(stdout);
。
【参考方案1】:
它无法将它写入控制台,因为相关代码永远无法到达。
只要打开窗口,您的代码就会运行一个几乎无限的 while 循环。
while(glfwGetWindowParam(GLFW_OPENED))
glfwSwapBuffers();
你应该把所有的初始化代码放在这个循环之前。
glewExperimental = GL_TRUE;
glewInit();
并在循环之前或循环中创建缓冲区对象。实际上,当您想将新内容加载到现有场景时,您会在循环内创建缓冲区对象。
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
printf("%u\n", vertexBuffer);
您的最终main
函数可能如下所示。
int main()
// GLFW initialization
glfwInit();
// ...
glfwOpenWindow(800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW);
glfwSetWindowTitle("My first OpenGL Application");
// GLEW initialization
glewExperimental = GL_TRUE;
glewInit();
// vertex buffer
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
printf("%u\n", vertexBuffer);
// main loop
bool running = true;
while(running)
// exit
if (!glfwGetWindowParam(GLFW_OPENED))
running = false;
// display
glfwSwapBuffers();
// clean up
glfwTerminate();
exit(EXIT_SUCCESS);
【讨论】:
这是定义的事件循环。我怎样才能打印到控制台一次?在交换缓冲区之前将这三行放在 while 语句中显然不是一个好主意.. 你应该把它放在while循环之前。我更新了代码示例。以上是关于无法在 GLEW 应用程序中将 OpenGL 缓冲区打印到控制台的主要内容,如果未能解决你的问题,请参考以下文章
从 DLL 链接到 OpenGL:运行时 glew 函数为空