我正在尝试新的SDL2 beta和OpenGL3上下文,并且遇到了一个奇怪的问题:
如果我在主函数中运行SDL初始化代码,它可以正常工作,但是我想把这个代码放在一个单独的init_sdl()函数中。
如果我将初始化代码放在单独的init_sdl()函数中,并从main()函数中调用此函数,则永远不会绘制背景颜色,并且程序开始疯狂消耗所有系统资源。
有人能指向一个在单独的函数中初始化SDL的可行示例吗?我似乎找不到一个...也许这是不可能的?我模糊地记得在SDL 1.2中遇到过类似的问题,但自从使用它已经过了几年了,我认为我从未找到解决方案。事实上,这可能是我选择改用SFML的原因。
我真的想使用SDL2而不是SFML,因为它可以在更多平台上运行,但是不能将事物分解成小函数对我来说是一个致命问题。这应该很容易,我错过了什么明显的东西吗?
编辑:
这个有效:
如果我在主函数中运行SDL初始化代码,它可以正常工作,但是我想把这个代码放在一个单独的init_sdl()函数中。
如果我将初始化代码放在单独的init_sdl()函数中,并从main()函数中调用此函数,则永远不会绘制背景颜色,并且程序开始疯狂消耗所有系统资源。
有人能指向一个在单独的函数中初始化SDL的可行示例吗?我似乎找不到一个...也许这是不可能的?我模糊地记得在SDL 1.2中遇到过类似的问题,但自从使用它已经过了几年了,我认为我从未找到解决方案。事实上,这可能是我选择改用SFML的原因。
我真的想使用SDL2而不是SFML,因为它可以在更多平台上运行,但是不能将事物分解成小函数对我来说是一个致命问题。这应该很容易,我错过了什么明显的东西吗?
编辑:
这个有效:
#include <iostream>
#include <GL/glew.h>
#include <SDL.h>
#define PROGRAM_NAME "SDL2 OpenGL3 Example"
int main(int argc, char** argv)
{
SDL_Window* sdl2_window = 0;
SDL_GLContext opengl3_context;
SDL_Init(SDL_INIT_VIDEO);
// set the opengl context version
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
// turn on double buffering set the depth buffer to 24 bits
// you may need to change this to 16 or 32 for your system
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
// create the sdl2 window
sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 512, 512,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
// create the opengl3 context
opengl3_context = SDL_GL_CreateContext(sdl2_window);
GLenum status = glewInit();
if (status != GLEW_OK)
{
std::cerr << "GLEW Error: " << glewGetErrorString(status) << "\n";
exit(1);
}
// sync buffer swap with monitor's vertical refresh rate
SDL_GL_SetSwapInterval(1);
// set background color
glClearColor( 1.0, 0.0, 0.0, 1.0 );
while (true)
{
int status = 0;
glClear( GL_COLOR_BUFFER_BIT );
SDL_GL_SwapWindow(sdl2_window);
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
break;
case SDL_KEYUP:
// if escape is pressed, quit
if (event.key.keysym.sym == SDLK_ESCAPE)
status = 1; // set status to 1 to exit main loop
break;
case SDL_QUIT:
status = 1;
break;
}
}
if (status == 1) // if received instruction to quit
break;
}
// delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems
SDL_GL_DeleteContext(opengl3_context);
SDL_DestroyWindow(sdl2_window);
SDL_Quit();
return 0;
}
这个不起作用:
#include <iostream>
#include <GL/glew.h>
#include <SDL.h>
#define PROGRAM_NAME "SDL2 OpenGL3 Example"
void init_sdl(SDL_Window* sdl2_window, SDL_GLContext& opengl3_context)
{
SDL_Init(SDL_INIT_VIDEO);
// set the opengl context version
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
// turn on double buffering set the depth buffer to 24 bits
// you may need to change this to 16 or 32 for your system
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
// create the sdl2 window
sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 512, 512,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
// create the opengl3 context
opengl3_context = SDL_GL_CreateContext(sdl2_window);
}
int main(int argc, char** argv)
{
SDL_Window* sdl2_window = 0;
SDL_GLContext opengl3_context;
init_sdl(sdl2_window, opengl3_context);
GLenum status = glewInit();
if (status != GLEW_OK)
{
std::cerr << "GLEW Error: " << glewGetErrorString(status) << "\n";
exit(1);
}
// sync buffer swap with monitor's vertical refresh rate
SDL_GL_SetSwapInterval(1);
// set background color
glClearColor( 1.0, 0.0, 0.0, 1.0 );
while (true)
{
int status = 0;
glClear( GL_COLOR_BUFFER_BIT );
SDL_GL_SwapWindow(sdl2_window);
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
break;
case SDL_KEYUP:
// if escape is pressed, quit
if (event.key.keysym.sym == SDLK_ESCAPE)
status = 1; // set status to 1 to exit main loop
break;
case SDL_QUIT:
status = 1;
break;
}
}
if (status == 1) // if received instruction to quit
break;
}
// delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems
SDL_GL_DeleteContext(opengl3_context);
SDL_DestroyWindow(sdl2_window);
SDL_Quit();
return 0;
}