Ik ben net begonnen aan SDL en OpenGL en ik teken nu een smiley op een quad en die laat ik rondbewegen..
Maar als ik die texture rond laat bewegen gebeuren er allemaal vage dingen met dat plaatje.. Ik dacht dat het visual tearing heette.
Maar dat hoort toch niet te kunnen als ik een double buffer gebruik? Of heb ik dat verkeerd ingesteld? Of is de manier waarop ik de quad verplaats niet goed?
Ik hoop dat iemand hier me een beetje op gang kan helpen
Maar als ik die texture rond laat bewegen gebeuren er allemaal vage dingen met dat plaatje.. Ik dacht dat het visual tearing heette.
Maar dat hoort toch niet te kunnen als ik een double buffer gebruik? Of heb ik dat verkeerd ingesteld? Of is de manier waarop ik de quad verplaats niet goed?
Ik hoop dat iemand hier me een beetje op gang kan helpen

PHP:
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/openglut.h>
#include <GL/glext.h>
class Sprite
{
public:
int x, y;
int w, h;
GLuint texture;
};
void Display(Sprite, int, int);
void InitScreen();
Sprite LoadSprite(char*);
Sprite smiley;
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetCaption("My first OpenGL program!", NULL);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
bool keepdoing = true;
SDL_Event event;
InitScreen();
smiley = LoadSprite("smiley.bmp");
smiley.x = 20; smiley.y = 20;
Uint8* KeyStates;
while(keepdoing)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT){ keepdoing = false; }
}
KeyStates = SDL_GetKeyState(NULL);
if(KeyStates[SDLK_UP]){ smiley.y -= 2; }
if(KeyStates[SDLK_DOWN]){ smiley.y += 2; }
if(KeyStates[SDLK_LEFT]){ smiley.x -= 2; }
if(KeyStates[SDLK_RIGHT]){ smiley.x += 2; }
Display(smiley, smiley.x, smiley.y);
}
SDL_Quit();
return 0;
}
void Display(Sprite sprite, int x, int y)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, sprite.texture);
glBegin(GL_QUADS);
glTexCoord2i(0,0); glVertex3d(x, y, 1);
glTexCoord2i(1,0); glVertex3d(x + sprite.w, y, 1);
glTexCoord2i(1,1); glVertex3d(x + sprite.w, y + sprite.h, 1);
glTexCoord2i(0,1); glVertex3d(x, y + sprite.h, 1);
glEnd();
glFlush();
SDL_GL_SwapBuffers();
}
void InitScreen()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glDisable(GL_CULL_FACE);
}
Sprite LoadSprite(char* file)
{
Sprite sprite;
SDL_Surface* surface = SDL_LoadBMP(file);
GLuint tex;
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h , 0, GL_BGR,
GL_UNSIGNED_BYTE, surface->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
sprite.w = surface->w;
sprite.h = surface->h;
sprite.texture = tex;
SDL_FreeSurface(surface);
return sprite;
}
Laatst bewerkt: