📅  最后修改于: 2023-12-03 15:18:07.622000             🧑  作者: Mango
OpenGL是一种图形库,用于处理3D图形。SDL (Simple DirectMedia Layer)是一个跨平台的多媒体库,可用于创建游戏和其他应用。在此介绍如何使用OpenGL和SDL调整窗口大小。
在开始之前,需要安装以下软件:
您可以按照官方说明进行安装。
要使用OpenGL和SDL创建窗口,请使用以下代码:
#include <SDL2/SDL.h>
SDL_Window* window;
SDL_GLContext context;
bool init() {
bool success = true;
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
success = false;
} else {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
window = SDL_CreateWindow("Window title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (!window){
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
success = false;
} else {
context = SDL_GL_CreateContext(window);
if (!context){
printf("OpenGL context could not be created! SDL_Error: %s\n", SDL_GetError());
success = false;
} else {
glewExperimental = GL_TRUE;
GLenum glewError = glewInit();
if (glewError != GLEW_OK){
printf("Error initializing GLEW! %s\n", glewGetErrorString(glewError));
}
glViewport(0, 0, 800, 600);
}
}
}
return success;
}
上面的代码将创建一个800x600的窗口,并为OpenGL创建一个上下文。可以根据需要更改窗口大小。
要调整窗口大小并重新绘制OpenGL场景,请使用以下代码:
void resize(int width, int height) {
glViewport(0, 0, width, height);
//对OpenGL场景进行重新绘制
}
glViewport
函数定义了视口区域的大小和位置。在上面的示例中,我们将其设置为整个窗口的大小。稍后将更新OpenGL场景。
通过SDL监听SDL_WINDOWEVENT_SIZE_CHANGED事件的发生,可以在窗口大小更改之后调整窗口大小。例如:
bool quit = false;
SDL_Event e;
while (!quit) {
while (SDL_PollEvent(&e)) {
switch (e.type) {
case SDL_QUIT:
quit = true;
break;
case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
int w, h;
SDL_GetWindowSize(window, &w, &h);
resize(w, h);
}
break;
}
}
//现在,重新绘制OpenGL场景
SDL_GL_SwapWindow(window);
}
上面的代码在每次窗口大小更改时调用resize
函数,并在重新绘制OpenGL场景后调用SDL_GL_SwapWindow
函数进行双缓冲交换。
通过了解如何使用OpenGL和SDL创建窗口并通过响应SDL_WINDOWEVENT_SIZE_CHANGED
事件调整窗口大小和重新绘制OpenGL场景,您可以创建一个具有可调整大小功能的基本OpenGL应用程序。