-
-
Save rahil627/9dfd7c69d902c357c0407fc7af6e25f1 to your computer and use it in GitHub Desktop.
OpenGL with SDL2. Compile it with "gcc -Wall -o skeleton skeleton.cpp -F /Library/Frameworks -lstdc++ -I /Library/Frameworks/SDL2.framework/Headers -framework SDL2 -framework OpenGL" on Mac OSX.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Simple SDL2 program using OpenGL as rendering pipeline. | |
*/ | |
#include <iostream> | |
#include <SDL2/SDL.h> | |
#include <SDL2/SDL_opengl.h> | |
#include <OpenGL/GLU.h> | |
#define SCREEN_WIDTH 640 | |
#define SCREEN_HEIGHT 480 | |
SDL_Window* gWindow = NULL; | |
SDL_GLContext gGlContext; | |
void SetOpenGLVersion() | |
{ | |
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); | |
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); | |
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); | |
} | |
void Display_InitGL() | |
{ | |
glShadeModel(GL_SMOOTH); | |
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | |
glClearDepth(1.0f); | |
glEnable(GL_DEPTH_TEST); | |
glDepthFunc(GL_LEQUAL); | |
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); | |
} | |
int Display_SetViewport(int width, int height) | |
{ | |
GLfloat ratio; | |
if (height == 0) { | |
height = 1; | |
} | |
ratio = GLfloat(width) / GLfloat(height); | |
glViewport(0, 0, GLsizei(width), GLsizei(height)); | |
glMatrixMode(GL_PROJECTION); | |
glLoadIdentity(); | |
gluPerspective(45.0f, ratio, 0.1f, 100.0f); | |
glMatrixMode(GL_MODELVIEW); | |
glLoadIdentity(); | |
return true; | |
} | |
void Display_Render() | |
{ | |
glLoadIdentity(); | |
glTranslatef(-1.5f, 0.0f, -6.0f); | |
glBegin(GL_TRIANGLES); | |
glVertex3f(0.0f, 1.0f, 0.0f); | |
glVertex3f(-1.0f, -1.0f, 0.0f); | |
glVertex3f(1.0f, -1.0f, 0.0f); | |
glEnd(); | |
glTranslatef(3.0f, 0.0f, 0.0f); | |
glBegin(GL_QUADS); | |
glVertex3f(-1.0f, 1.0f, 0.0f); | |
glVertex3f(1.0f, 1.0f, 0.0f); | |
glVertex3f(1.0f, -1.0f, 0.0f); | |
glVertex3f(-1.0f, -1.0f, 0.0f); | |
glEnd(); | |
} | |
void close() | |
{ | |
SDL_DestroyWindow(gWindow); | |
gWindow = NULL; | |
SDL_Quit(); | |
} | |
int main(int argc, char *argv[]) | |
{ | |
// initialize sdl | |
if (SDL_Init(SDL_INIT_VIDEO) < 0) | |
{ | |
std::cout << "SDL cannot init with error " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
// set opengl version to use in this program | |
SetOpenGLVersion(); | |
// create window | |
gWindow = SDL_CreateWindow("Opengl", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); | |
if (gWindow == NULL) | |
{ | |
std::cout << "Cannot create window with error " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
// create opengl context | |
gGlContext = SDL_GL_CreateContext(gWindow); | |
if (gGlContext == NULL) | |
{ | |
std::cout << "Cannot create OpenGL context with error " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
// initialize opengl | |
Display_InitGL(); | |
// set camera | |
Display_SetViewport(SCREEN_WIDTH, SCREEN_HEIGHT); | |
bool quit = false; | |
SDL_Event sdlEvent; | |
while (!quit) | |
{ | |
while (SDL_PollEvent(&sdlEvent) != 0) | |
{ | |
if (sdlEvent.type == SDL_QUIT) | |
{ | |
quit = true; | |
} | |
} | |
// clear bg color and depth buffer | |
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
// render stuff here | |
Display_Render(); | |
// swap window inorder to update opengl | |
SDL_GL_SwapWindow(gWindow); | |
} | |
// clear resource | |
close(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment