我阅读了一些关于OpenGL的教程,现在我正在尝试将它与SDL一起使用。问题是,当我在while循环中使用SDL_GL_SwapBuffers()时,窗口就会冻结。这是一些代码:
#include "SDL.h"
#include "system.h"
#include "SDL_opengl.h"
System Sys(800, 600, 32);
SDL_Event kpress;
int main( int argc, char* args[] )
{
Sys.init();
bool quit = false;
while (!quit)
{
while (SDL_PollEvent(&kpress)) if(kpress.type == SDL_QUIT) quit = true;
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapBuffers();
}
SDL_Quit();
return 0;
}
------------------------------These are in system.h, class System----------------
bool System::init()
{
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
errorCode = 1;
return false;
}
if (SDL_SetVideoMode(screen_h, screen_w, bpp, SDL_OPENGL) == 0)
{
errorCode = 2;
return false;
}
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
if (!init_GL())
{
errorCode = 3;
return false;
}
SDL_WM_SetCaption("Engine", 0);
return true;
}
bool System::init_GL()
{
glClearColor(1, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screen_h, screen_w, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (glGetError() != GL_NO_ERROR) return false;
return true;
}
如果我绘制一些形状或使用计时器来限制FPS - 没有任何变化。 你有什么想法吗?
答案 0 :(得分:3)
我的第一个建议:摆脱那个虚假的系统类:到目前为止,它所做的所有任务都是纯粹的顺序/程序性的,应该反映在程序大纲中。人们倾向于把所有东西都放到课堂上,因为他们被教导从对象模型的角度看待一切。但是这个System类必须遵循单例模式,在我看来,这是一种反模式。
您放在init_GL中的所有内容都属于渲染循环。创建渲染上下文后,OpenGL初始化结束。 OpenGL状态未初始化它按设置。 OpenGL 对象已初始化,但也可根据需要进行初始化。
你也没有正确使用glGetError。需要在循环中调用它,直到不再报告错误为止。因此,如果报告GL错误,则挽救也毫无意义。应将OpenGL错误视为诊断错误。
在调用SDL_GL_SetAttribute
之前必须设置 SDL_SetVideoMode
,这样你可能不会进行双重缓冲。
答案 1 :(得分:0)
嘿,你没有调用初始化OpenGL的函数:init_GL()
答案 2 :(得分:0)
你没有检查system :: init的结果 - 它可能在该函数中的某个地方失败而没有正确设置你的初始状态
答案 3 :(得分:0)
SDL #defines
main()
为SDL_main()
,允许它在程序启动前进行一些额外的初始化。您似乎绕过了静态初始化的类。
尝试在System
中构建main()
对象。