misc/sdl-opengl-vbo/sdl-opengl-vbo.cc

91 lines
2.7 KiB
C++

#define GL_GLEXT_PROTOTYPES
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "checkGLError.h"
#define WIDTH 500
#define HEIGHT 500
#define ADDR_DIFF(x, y) ((unsigned long) (y) - (unsigned long) (x))
#define GL_CHECK(x) ({x; checkGLError();})
void init(void)
{
GL_CHECK(glClearColor (0.0, 0.0, 0.0, 0.0));
GL_CHECK(glEnable(GL_DEPTH_TEST));
GL_CHECK(glShadeModel(GL_SMOOTH));
GL_CHECK(glViewport(0, 0, WIDTH, HEIGHT));
GL_CHECK(glMatrixMode(GL_PROJECTION));
GL_CHECK(glLoadIdentity());
gluPerspective(60.0, (GLfloat)WIDTH/(GLfloat)WIDTH, 1.0, 30.0);
GL_CHECK(glMatrixMode(GL_MODELVIEW));
GL_CHECK(glLoadIdentity());
GL_CHECK(glTranslatef(0.0, 0.0, -3.6));
}
void display(void)
{
GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
static const GLfloat data[][2][4] = {
{{-0.8, -0.8, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0}},
{{0.8, -0.8, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}},
{{0.8, 0.8, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}},
{{-0.8, 0.8, 0.0, 1.0}, {0.0, 0.4, 1.0, 1.0}}
};
static const GLbyte indexes[] = {1, 0, 2, 3};
GLuint buffers[2];
GL_CHECK(glGenBuffers(sizeof(buffers)/sizeof(buffers[0]), buffers));
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0]));
GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW));
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]));
GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes,
GL_STATIC_DRAW));
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffers[0]));
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]));
GL_CHECK(glVertexPointer(3, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]),
(void *) ADDR_DIFF(&data, &data[0][0][0])));
GL_CHECK(glColorPointer(4, GL_FLOAT, ADDR_DIFF(&data[0], &data[1]),
(void *) ADDR_DIFF(&data, &data[0][1][0])));
GL_CHECK(glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, NULL));
SDL_GL_SwapBuffers();
}
int main(int argc, char *argv[])
{
if (SDL_Init(SDL_INIT_VIDEO))
{
printf("Failed to initialize SDL!\n");
return 1;
}
atexit(SDL_Quit);
SDL_Surface *screen;
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if (!(screen = SDL_SetVideoMode(WIDTH, HEIGHT, 16, SDL_OPENGL)))
{
printf("Failed to set video mode!\n");
SDL_Quit();
return 2;
}
SDL_WM_SetCaption(argv[0], argv[0]);
init();
display();
SDL_Event event;
while (SDL_WaitEvent(&event))
{
if (event.type == SDL_QUIT)
break;
else if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_ESCAPE)
break;
}
}
}