ProgrammingのTipなど

テクスチャ


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

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます