Witam
Szukam jakiegoś tutka, kodu, dokumentacji, czegokolwiek w którym wykorzystuje się wyświetlanie textur za pomocą fragmentów bitmap.
#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 ) { } // Also check if the height is a power of 2 if ( (surface->h & (surface->h - 1)) != 0 ) { } //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 { } // 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 { 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) { return 1; } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL | SDL_RESIZABLE); if (!screen) { 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 case SDLK_ESCAPE: quit = true; break; default: ; } } } } clean_up(); }
// Top-left vertex (corner) glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 0); // Bottom-left vertex (corner) glTexCoord2f(0.5f, 0.0f); glVertex3f(0, 100, 0); // Bottom-right vertex (corner) glTexCoord2f(0.5f, 0.5f); glVertex3f(100,100, 0); // Top-right vertex (corner) glTexCoord2f(0.0f, 0.5f); glVertex3f(100, 0, 0);