SDL教程-003.SDL使用OpenGL渲染图形
SDL 集成OpenGL入门Demo
#include <iostream>
#include <SDL/SDL.h>
#include <GL/freeglut.h>
using namespace std;
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
SDL_Window *mainwindow;
SDL_GLContext maincontext;
* and quits the application */
void sdldie(const char *msg)
{
printf("%s: %s\n", msg, SDL_GetError());
SDL_Quit();
exit(1);
}
void quit(int code)
{
SDL_Quit();
exit(code);
}
void checkSDLError(int line = -1)
{
#ifndef NDEBUG
const char *error = SDL_GetError();
if (*error != '\0')
{
printf("SDL Error: %s\n", error);
if (line != -1)
printf(" + line: %i\n", line);
SDL_ClearError();
}
#endif
}
void initGL(int width, int height)
{
float ratio = (float)width / (float)height;
glShadeModel(GL_SMOOTH);
glClearColor(0, 0, 0, 0);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, ratio, 1.0, 100.0);
}
void initSDL()
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
sdldie("Unable to initialize SDL");
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
mainwindow = SDL_CreateWindow("OpenGL in SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
if (!mainwindow)
sdldie("Unable to create window");
checkSDLError(__LINE__);
maincontext = SDL_GL_CreateContext(mainwindow);
checkSDLError(__LINE__);
SDL_GL_SetSwapInterval(1);
}
void renderGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0);
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
SDL_GL_SwapWindow(mainwindow);
}
void resizeGL(int width, int height)
{
if (height == 0)
{
height = 1;
}
glViewport(0, 0, (GLint)width, (GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void handleKeyEvent(SDL_Keysym* keysym)
{
switch (keysym->sym)
{
case SDLK_ESCAPE:
quit(0);
break;
case SDLK_SPACE:
cout << "Space" << endl;
break;
default:
break;
}
}
void handleEvents()
{
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
handleKeyEvent(&event.key.keysym);
break;
case SDL_QUIT:
quit(0);
break;
case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_RESIZED)
{
if (mainwindow)
{
int tmpX, tmpY;
SDL_GetWindowSize(mainwindow, &tmpX, &tmpY);
resizeGL(tmpX, tmpY);
}
}
SDL_GL_SwapWindow(mainwindow);
break;
}
}
}
int main(int argc, char *argv[])
{
initSDL();
initGL(SCREEN_WIDTH, SCREEN_HEIGHT);
renderGL();
while (true)
{
handleEvents();
renderGL();
}
return 0;
}
SDL 集成freeglut+glew
#include <iostream>
#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
using namespace std;
#ifdef _DEBUG
#pragma comment( lib, "glew32d.lib" )
#else if
#pragma comment( lib, "glew32.lib" )
#endif
bool quit;
SDL_Window* window;
SDL_GLContext glContext;
SDL_Event sdlEvent;
int main(int argc, char *argv[])
{
std::cout << "你好" << std::endl;
quit = false;
//Use OpenGL 3.1 core
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
// Initialize video subsystem
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
// Display error message
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
return false;
}
else
{
// Create window
window = SDL_CreateWindow("Hello World!", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (window == NULL)
{
// Display error message
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
return false;
}
else
{
// Create OpenGL context
glContext = SDL_GL_CreateContext(window);
if (glContext == NULL)
{
// Display error message
printf("OpenGL context could not be created! SDL Error: %s\n", SDL_GetError());
return false;
}
else
{
// Initialize glew
glewInit();
}
}
}
// Game loop
while (!quit)
{
while (SDL_PollEvent(&sdlEvent) != 0)
{
// Esc button is pressed
if (sdlEvent.type == SDL_QUIT)
{
quit = true;
}
}
// Set background color as cornflower blue
glClearColor(0.39f, 0.58f, 0.93f, 1.f);
// Clear color buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Update window with OpenGL rendering
SDL_GL_SwapWindow(window);
}
//Destroy window
SDL_DestroyWindow(window);
window = NULL;
//Quit SDL subsystems
SDL_Quit();
return 0;
}