main.cpp
#include <GL/glut.h> #include <GL/gl.h> #include <GL/glu.h> #include "Texture.hpp" float xrot, yrot, zrot; TTexture *tex1; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(zrot,0.0f,0.0f,1.0f); glBindTexture(GL_TEXTURE_2D, tex1->ID); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); xrot+=0.0f; yrot+=7.0f; zrot+=0.0f; glutSwapBuffers(); } void onKeyboard(unsigned char key, int x, int y) { switch (key) { case '\033': exit(0); default: break; } } void onMouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: break; case GLUT_MIDDLE_BUTTON: break; case GLUT_RIGHT_BUTTON: break; default: break; } } void onReshape(int width, int height) { if (height==0) height=1; if (width==0) width=1; glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void timer(int value) { glutPostRedisplay(); glutTimerFunc(30 , timer , 0); } void glInit(void) { glClearColor(0.9, 0.9, 0.9, 1.0); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void init() { tex1 = new TTexture("tartan1.bmp"); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(750,750); int window = glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(onReshape); glutMouseFunc(onMouse); glutKeyboardFunc(onKeyboard); glutTimerFunc(50 , timer , 0); glInit(); init(); glutMainLoop(); delete tex1; return 1; }
Texture.hpp
#ifndef TEXTURE_H #define TEXTURE_H #include <stdio.h> #include <stdlib.h> #include <GL/gl.h> #include <GL/glu.h> // This program only 24bit Bitmap class TTexture { public: TTexture(char *fileName); void init(); int width, height; unsigned int ID; private: char *data; }; TTexture::TTexture(char *fileName) { FILE *pFile = NULL; unsigned short planeNum; unsigned short BPPnum; int i; if( (pFile = fopen(fileName, "rb") ) == NULL ) printf("%s this file don't found\n",fileName); fseek( pFile, 18, SEEK_CUR ); if( (i = fread(&width, 4, 1, pFile) ) != 1 ) printf("%s this file can't read width \n", fileName); if( (i = fread(&height, 4, 1, pFile) ) != 1 ) printf("%s this file can't read height \n", fileName); if( (fread(&planeNum, 2, 1, pFile) ) != 1 ) printf("%s this file can't read count of plane \n", fileName); if( planeNum != 1 ) printf( "%s in this file count of plane is not 1: %u \n", fileName, planeNum ); if( (i = fread(&BPPnum, 2, 1, pFile)) != 1 ) printf( "%s this file can't read BPP\n", fileName ); if( BPPnum != 24 ) printf( "%s in this file BPP is not 24: %u\n", fileName, BPPnum ); fseek( pFile, 24, SEEK_CUR ); //this program is only 3*8=24 bit BMP file int imagesize = (width * height) * 3; data = (char*) malloc( imagesize ); if( (i = fread(data, imagesize, 1, pFile) ) != 1 ) printf("%s this file can't read data of image \n", fileName); //bgr -> rgb char charTmp; for( i = 0; i < imagesize; i += 3 ) { charTmp = data[i]; data[i] = data[i+2]; data[i+2] = charTmp; } char *tmpdata = (char*) malloc( imagesize ); for (i = 0; i < height; i++) { for (int j = 0; j < width*3; j+=3) { tmpdata[i*width*3 + j] = data[i*width*3 + j]; tmpdata[i*width*3 + j+1] = data[i*width*3 + j+1]; tmpdata[i*width*3 + j+2] = data[i*width*3 + j+2]; } } int tmph = 0; for (i = 0; i < height; i++) { for (int j = 0; j < width*3; j+=3) { tmph = height - i; data[i*width*3 + j] = tmpdata[tmph*width*3 + j]; data[i*width*3 + j+1] = tmpdata[tmph*width*3 + j+1]; data[i*width*3 + j+2] = tmpdata[tmph*width*3 + j+2]; } } free(tmpdata); fclose(pFile); init(); } void TTexture::init() { glEnable(GL_TEXTURE_2D); glGenTextures(1, &ID); glBindTexture(GL_TEXTURE_2D, ID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); } #endif
コメントをかく