【发布时间】:2011-12-22 07:12:33
【问题描述】:
我正在使用 OpenGL/SDL 开发一个程序,但窗口不会绘制。窗口的条目出现在任务栏和 alt+tab 菜单中,但不显示缩略图。当我单击它时,它被标记为活动,但屏幕上没有任何变化。
我可以验证 glClear(GL_COLOR_BUFFER_BIT) 和 SDL_GL_SwapBuffers() 正在从我的渲染循环中被调用,并且 SDL_SetVideoMode 正在成功,但它仍然不会渲染。这不是共享库问题,因为其他 SDL/GL 应用程序运行良好。
有什么想法吗?
编辑:
这是图形初始化:
void GraphicsManager::initGraphics() {
// Access prefs
PreferencesManager* prefMgr = PreferencesManager::getInstance();
int width = prefMgr->getIntKey("res_width");
int height = prefMgr->getIntKey("res_height");
if(SDL_InitSubSystem(SDL_INIT_VIDEO) != 0) {
fprintf(stderr, "Cannot initialize SDL video!\n");
exit(1);
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
m_screen = SDL_SetVideoMode(width, height, 0, SDL_OPENGL);
if(!m_screen) {
fprintf(stderr, "Error: Invalid screen pointer\n");
exit(2);
}
SDL_ShowCursor(SDL_DISABLE);
// Setup OpenGL stuffs
glDisable(GL_DEPTH_TEST); // We're only using 2D
glClearColor(0.0, 0.0, 0.0, 0.0);
glViewport(0.0, 0.0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, height, 0.0, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapBuffers();
// Init FPS stuff
m_avgFps = 60.0f;
m_lastUpdate = SDL_GetTicks();
}
这是我的主循环:
while(stateMgr->getState() != GS_QUIT) {
// Process input events
inputMgr->processEvents();
// Update the current system mode
stateMgr->update();
// Update GUI state
guiMgr->update();
// Render
gfxMgr->render();
//char buf[16];
//snprintf(buf, 16, "FPS: %4.2f", gfxMgr->getFramerate());
//testWindow->getChild("TestRoot/Framerate")->setText(buf);
SDL_Delay(10);
}
这是渲染函数:
void GraphicsManager::render() {
std::list<IRenderCallback*>::iterator rci;
// Clear the screen
glClear(GL_COLOR_BUFFER_BIT);
// Run render callbacks
/*for(rci=m_renderCallbacks.begin();rci != m_renderCallbacks.end();rci++) {
(*rci)->preRender();
}
// Iterate through all renderables and render them
std::list<Renderable*>::iterator i;
for(i=m_renderables.begin();i != m_renderables.end();i++) {
(*i)->render();
}
// Run render callbacks
for(rci=m_renderCallbacks.begin();rci != m_renderCallbacks.end();rci++) {
(*rci)->preFlip();
}*/
// Flip the buffers
SDL_GL_SwapBuffers();
// Update FPS stuff
Uint32 now = SDL_GetTicks();
Uint32 timeTaken = now - m_lastUpdate;
m_lastUpdate = now;
double seconds = (double)timeTaken / 1000.0f;
m_avgFps = (1.0f / seconds);
// Run render callbacks
for(rci=m_renderCallbacks.begin();rci != m_renderCallbacks.end();rci++) {
(*rci)->postRender();
}
}
【问题讨论】:
-
特别是您的窗口创建和主循环。
-
好的,我添加了主循环,渲染代码,渲染初始化
标签: c linux opengl graphics sdl