neHe OpenGL lession 6

来源:互联网 发布:我的世界js物品攻击力 编辑:程序博客网 时间:2024/05/23 01:20

加载纹理

// lession6// Mac OS X / Linux// linux <GL/glut.h> <GL/gl.h> <GL/glu.h>#include <OpenGL/OpenGL.h>#include <GLUT/GLUT.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>/* ascii code for the escape key */#define ESCAPE 27/* the number of our GLUT window */int window;/* float for x rotation, y rotation, z rotation */float xrot, yrot, zrot;/* storage for one texture */GLuint texture[1];/* Imaget type - contains height, width, and data */struct Image {unsigned long sizeX;unsigned long sizeY;char *data;};typedef struct Image Image;// quick and dirty bitmap loader... for 24 bit bitmaps with 1 plane only.// See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/BMP.txt for more info.int ImageLoader(char *filename, Image *image) {FILE *file; unsigned long size; // size of the image in bytesunsigned long i;// standard counter.unsigned short int planes; // number of plances in image (must be 1)unsigned short int bpp; // number of bits per pixel (must be 24)char temp;// temporary color storage for bgr-rgb conversion.// make sure the file is there.if ((file = fopen(filename, "rb")) == NULL) {printf("File not found : %s\n", filename);return 0;}// seek through the bmp header, up to the width/height:    fseek(file, 18, SEEK_CUR);    // read the width    if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {printf("Error reading width from %s.\n", filename);return 0;    }    printf("Width of %s: %lu\n", filename, image->sizeX);        // read the height     if ((i = fread(&image->sizeY, 4, 1, file)) != 1) {printf("Error reading height from %s.\n", filename);// return 0;    }    printf("Height of %s: %lu\n", filename, image->sizeY);    // image->sizeX = image->sizeY = 256;    // if (image->sizeX != 256 || )// calculate the size (assuming 24 bits or 3 bytes per pixel).size = image->sizeX * image->sizeY * 3;// read the plancesif ((fread(&planes, 2, 1, file)) != 1) {printf("Error reading planes from %s.\n", filename);return 0;}if (planes != 1) {printf("Plances from %s is not 1: %u\n", filename, planes);return 0;}// read the bppif ((i == fread(&bpp, 2, 1, file)) != 1) {printf("Error reading bpp from %s.\n", filename);return 0;}if (bpp != 24) {printf("Bpp from %s is not 24: %u\n", filename, bpp);return 0;}// Seek past the rest of the bitmap header.fseek(file, 24, SEEK_CUR);// read the data.image->data = (char *) malloc(size);if (image->data == NULL) {printf("Error allocating memory for color-corrected image data\n");return 0;}if ((i = fread(image->data, size, 1, file)) != 1) {printf("Error reading image data form %s.\n", filename);return 0;}for (i = 0; i < size; i += 3) { // reverse all of the colors. (bgr -> rgb)temp = image->data[i];image->data[i] = image->data[i + 2];image->data[i+2] = temp;}fclose(file);// we're done.return 1;}// Load Bitmaps and convert to texturevoid loadGLTextures() {// Load TextureImage *image1;// allocate space for texture.image1 = (Image *) malloc(sizeof(Image));if (image1 == NULL) {printf("Error allocating space for image.\n");exit(0);}// /Users/jabez/Developer/mac/9_7/Data/lesson6/NeHe.bmp// ./Data/lession6/NeHe.bmpif (!ImageLoader("Data/lesson6/NeHe.bmp", image1)) {exit(1);}// Create textureglGenTextures(1, &texture[0]);glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size)// scale linearly when image bigger than textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // scale linearly when image smalled than textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// 2D texture, level of detail 0 (normal), 3 components (red, green, blue), // x size from image, y size from image// border 0 (normal), rgb color data, unsigned byte data, and finally the data// itself.glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX,    image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);}/* A general OpenGL initialization function.   Sets all of the initial parameters. */// We clal this right after our OpenGL window is created.void initGL(int width, int height) {loadGLTextures(); // Load the Texture(s)glEnable(GL_TEXTURE_2D); // Enable Texture MappingglClearColor(0.0f, 0.0f, 1.0f, 0.0f); // Clear the background color to blueglClearDepth(1.0); // Enables Clearing  of the depth bufferglDepthFunc(GL_LESS); // The type of depth test to do.glEnable(GL_DEPTH_TEST); // Enables depth testingglShadeModel(GL_SMOOTH); // Enables smooth color shadingglMatrixMode(GL_PROJECTION);glLoadIdentity(); // Reset the projection matrix.gluPerspective(45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f); // Calculate the aspect ratio of the window.glMatrixMode(GL_MODELVIEW);}/* The function called when our window is resized (which shouldn't happend,because we're fullscreen) */void resizeGLScene(int width, int height) {if (height == 0)height = 1;// Prevent a divide by zero if the window is too smallglViewport(0, 0, width, height);  // reset teh current viewport and perspective transformationglMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW);}/* The main drawing function. */void drawGLScene(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f);  // move 5 units into the screen.glRotatef(xrot, 1.0f, 0.0f, 0.0f); // Rotate on the x axisglRotatef(yrot, 0.0f, 1.0f, 0.0f);  // Rotate on the y axisglRotatef(zrot, 0.0f, 0.0f, 1.0f); // Rotate on the z axisglBindTexture(GL_TEXTURE_2D, texture[0]); // choose teh texture to use.glBegin(GL_QUADS); // begin drawing a cube// Front Face (note the texture's corners have to match the quads's corners)glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom Left  of the texture and quadglTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // bottom right of the texture and quadglTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // top right of the texture and quadglTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // top left of the texture and quad// Back faceglTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // bottom right glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // top right glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // top left glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // bottom left // Top FaceglTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // top leftglTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // bottom leftglTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // bottom rightglTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // top right// Bottom FaceglTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // top rightglTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // top leftglTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // bottom leftglTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);// Right faceglTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom RightglTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // top rightglTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // top leftglTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // bottom left// Left faceglTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // bottom leftglTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // bottom rightglTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // top rightglTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // top leftglEnd(); // done with the polygon.xrot += 1.0f; yrot += 1.0f;zrot += 1.0f;// since this is double buffered, swap the buffers to display what just got drawn.glutSwapBuffers();}/* The function claled whever a key is pressed. */void keyPressed(unsigned char key, int x, int y){/* avoid thrashing this procedure */usleep(100);/* If escape is pressed, kill everything. */if (key == ESCAPE){/* shut down our window */glutDestroyWindow(window);exit(0); /* exit the program ... normal termination. */}}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);glutInitWindowSize(640, 480);glutInitWindowPosition(0, 0);window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ..NeHe '99");glutDisplayFunc(&drawGLScene);// glutFullScreen()glutIdleFunc(&drawGLScene);glutReshapeFunc(&resizeGLScene);glutKeyboardFunc(&keyPressed);initGL(640, 480); glutMainLoop(); /* Start Event Processing Engine. */return 0;}



相关代码下载地址: http://download.csdn.net/detail/liyan223/7996133




















0 0
原创粉丝点击