1
/*******************************************************************
3
* Using SDL With OpenGL *
5
* Tutorial by Kyle Foley (sdw) *
7
* http://gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL *
9
*******************************************************************/
12
THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
13
AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
15
THE ORIGINAL AUTHOR IS KYLE FOLEY.
17
THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
18
OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
19
MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
20
ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
21
RESULTING FROM THE USE, MODIFICATION, OR
22
REDISTRIBUTION OF THIS SOFTWARE.
26
#include "SDL/SDL_image.h"
27
#include "SDL/SDL_opengl.h"
33
int main(int argc, char *argv[])
37
// Slightly different SDL initialization
38
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
39
printf("Unable to initialize SDL: %s\n", SDL_GetError());
43
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new*
45
screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL ); // *changed*
47
printf("Unable to set video mode: %s\n", SDL_GetError());
51
// Set the OpenGL state after creating the context with SDL_SetVideoMode
53
glClearColor( 0, 0, 0, 0 );
56
glEnable( GL_TEXTURE_2D ); // Need this to display a texture XXX unnecessary in OpenGL ES 2.0/WebGL
59
glViewport( 0, 0, 640, 480 );
61
glMatrixMode( GL_PROJECTION );
62
glPushMatrix(); // just for testing
65
glOrtho( 0, 640, 480, 0, -1000, 1000 );
67
glMatrixMode( GL_MODELVIEW );
70
// Load the OpenGL texture
72
GLuint texture; // Texture object handle
73
SDL_Surface *surface; // Gives us the information to make the texture
75
if ( (surface = IMG_Load("screenshot.png")) ) {
77
// Check that the image's width is a power of 2
78
if ( (surface->w & (surface->w - 1)) != 0 ) {
79
printf("warning: image.bmp's width is not a power of 2\n");
82
// Also check if the height is a power of 2
83
if ( (surface->h & (surface->h - 1)) != 0 ) {
84
printf("warning: image.bmp's height is not a power of 2\n");
87
// Have OpenGL generate a texture object handle for us
88
glGenTextures( 1, &texture );
90
// Bind the texture object
91
glBindTexture( GL_TEXTURE_2D, texture );
93
// Set the texture's stretching properties
94
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
95
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
97
//SDL_LockSurface(surface);
100
memset(surface->pixels, 0x66, surface->w*surface->h);
102
// Edit the texture object's image data using the information SDL_Surface gives us
103
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0,
104
GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels );
106
//SDL_UnlockSurface(surface);
109
printf("SDL could not load image.bmp: %s\n", SDL_GetError());
114
// Free the SDL_Surface only if it was successfully created
116
SDL_FreeSurface( surface );
119
// Clear the screen before drawing
120
glClear( GL_COLOR_BUFFER_BIT );
122
// Bind the texture to which subsequent calls refer to
123
glBindTexture( GL_TEXTURE_2D, texture );
126
GLfloat fogColor[] = { 1.0, 0.5, 0.5, 0.05 };
127
glFogfv(GL_FOG_COLOR, fogColor);
128
glFogf(GL_FOG_DENSITY, 0.2);
129
glFogi(GL_FOG_MODE, GL_EXP2);
131
assert(glIsEnabled(GL_FOG));
134
glTexCoord2i( 0, 0 ); glVertex3f( 10, 10, 10 );
135
glTexCoord2i( 1, 0 ); glVertex3f( 300, 10, 10 );
136
glTexCoord2i( 1, 1 ); glVertex3f( 300, 128, 10 );
137
glTexCoord2i( 0, 1 ); glVertex3f( 10, 128, 10 );
139
glTexCoord2f( 0, 0.5 ); glVertex3f( 410, 10, 5 );
140
glTexCoord2f( 1, 0.5 ); glVertex3f( 600, 10, 6 );
141
glTexCoord2f( 1, 1 ); glVertex3f( 630, 200, 7 );
142
glTexCoord2f( 0.5, 1 ); glVertex3f( 310, 250, 8 );
145
glBegin( GL_TRIANGLE_STRIP );
146
glTexCoord2i( 0, 0 ); glVertex3f( 100, 300, 1 );
147
glTexCoord2i( 1, 0 ); glVertex3f( 300, 300, 1 );
148
glTexCoord2i( 1, 1 ); glVertex3f( 300, 400, 1 );
149
glTexCoord2i( 0, 1 ); glVertex3f( 500, 410, 1 );
153
glDisable(GL_TEXTURE_2D);
156
glColor3ub(90, 255, 255);
158
glVertex3f( 10, 410, 5 );
159
glVertex3f( 300, 410, 50 );
160
glVertex3f( 300, 480, 100 );
161
glVertex3f( 10, 470, 5 );
165
glColor3f(1.0, 0, 1.0); glVertex3f( 410, 410, 10 );
166
glColor3f(0, 1.0, 0); glVertex3f( 600, 410, 10 );
167
glColor3f(0, 0, 1.0); glVertex3f( 600, 480, 10 );
168
glColor3f(1.0, 1.0, 1.0); glVertex3f( 410, 470, 10 );
171
SDL_GL_SwapBuffers();
174
// Wait for 3 seconds to give us a chance to see the image
178
// Now we can delete the OpenGL texture and close down SDL
179
glDeleteTextures( 1, &texture );