Nie wiem jakiej używam wersji OpenGL (IMG:
style_emoticons/default/tongue.gif)
To jest kod (taki tam testowy do ogarnięcia wyświetlania textur) w którym wyświetlam textur.
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_opengl.h>
#include <stdlib.h>
#include <stdio.h>
GLuint texture = NULL; //this is a handle to our texture object
GLenum texture_format = NULL;
GLint nofcolors;
SDL_Event event;
int loadImage() {
SDL_Surface *surface; // this surface will tell us the details of the image
if ((surface = IMG_Load("/home/qba/cpp/opengl/Debug/spr.png"))) {
// Check that the image’s width is a power of 2
if ( (surface->w & (surface->w - 1)) != 0 ) {
printf("warning: image.bmp's width is not a power of 2\n"); }
// Also check if the height is a power of 2
if ( (surface->h & (surface->h - 1)) != 0 ) {
printf("warning: image.bmp's width is not a power of 2\n"); }
//get number of channels in the SDL surface
nofcolors = surface->format->BytesPerPixel;
//contains an alpha channel
if (nofcolors == 4) {
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
} else if (nofcolors == 3) //no alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
} else {
printf("warning: the image is not truecolor…this will break "); }
// Have OpenGL generate a texture object handle for us
glGenTextures(1, &texture);
// Bind the texture object
glBindTexture(GL_TEXTURE_2D, texture);
// Set the texture’s stretching properties
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, nofcolors, surface->w, surface->h-50, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels);
} else {
printf("SDL could not load image.bmp: %s\n", SDL_GetError
()); SDL_Quit();
return 1;
}
// Free the SDL_Surface only if it was successfully created
if (surface) {
SDL_FreeSurface(surface);
}
}
void drawImage() {
// Clear the screen before drawing
glClear(GL_COLOR_BUFFER_BIT);
// Bind the texture to which subsequent calls refer to
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
// Top-left vertex (corner)
glTexCoord2i(0, 0);
glVertex3f(0, 0, 0);
// Bottom-left vertex (corner)
glTexCoord2i(1, 0);
glVertex3f(0, 100, 0);
// Bottom-right vertex (corner)
glTexCoord2i(1, 1);
glVertex3f(100,100, 0);
// Top-right vertex (corner)
glTexCoord2i(0, 1);
glVertex3f(100, 0, 0);
glEnd();
glBegin(GL_QUADS);
// Top-left vertex (corner)
glTexCoord2i(0, 0);
glVertex3f(100, 0, 0);
// Bottom-left vertex (corner)
glTexCoord2i(1, 0);
glVertex3f(100, 100, 0);
// Bottom-right vertex (corner)
glTexCoord2i(1, 1);
glVertex3f(200,100, 0);
// Top-right vertex (corner)
glTexCoord2i(0, 1);
glVertex3f(200, 0, 0);
glEnd();
glLoadIdentity();
SDL_GL_SwapBuffers();
}
int init() {
SDL_Surface *screen;
// Slightly different SDL initialization
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("Unable to initialize SDL: %s\n", SDL_GetError
()); return 1;
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL | SDL_RESIZABLE);
if (!screen) {
printf("Unable to set video mode: %s\n", SDL_GetError
()); return 1;
}
}
void init_GL() {
// Set the OpenGL state after creating the context with SDL_SetVideoMode
glClearColor(0, 0, 0, 0);
glEnable(GL_TEXTURE_2D); // Need this to display a texture
glViewport(0, 0, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 640, 480, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void clean_up() {
glDeleteTextures(1, &texture);
SDL_Quit();
}
int main(int argc, char *argv[]) {
//Make sure the program waits for a quit
bool quit = false;
init();
init_GL();
loadImage();
drawImage();
while (quit == false) {
if (SDL_PollEvent(&event)) {
//If a key was pressed
if (event.type == SDL_KEYDOWN) {
//Adjust the velocity
switch (event
.key.keysym
.sym
) { case SDLK_ESCAPE:
quit = true;
break;
default:
;
}
}
}
}
clean_up();
}