Advertisement
Kojima0502

OpenGL_bitmap_texture

Jan 25th, 2014
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <GLUT/glut.h>
  4.  
  5.  
  6. /* 画像についての情報を保存しておく変数・定数 */
  7. #define  IMGFILE  "depth_0010-01_RGB.bmp"
  8. #define  CHANNEL  3  // 画像の色数(R, G, B)
  9. int width;           // 画像の幅
  10. int height;          // 画像の高さ
  11. GLuint texture;      // テクスチャの識別番号
  12. GLubyte* image;      // ビットマップ画像データを格納
  13.  
  14. /* 関数のプロトタイプ宣言 */
  15. void loadImage(const char* filepath);  // BMP 画像を読み込む
  16.  
  17.  
  18. void display(void)
  19. {
  20.     glClear(GL_COLOR_BUFFER_BIT);
  21.    
  22.     /* 画像の表示 */
  23.     glEnable(GL_TEXTURE_2D);
  24.     glBindTexture(GL_TEXTURE_2D, texture);
  25.     glBegin(GL_QUADS);
  26.     glTexCoord2f(1.0, 0.0);  glVertex2f(1.0, 0.0);
  27.     glTexCoord2f(1.0, 1.0);  glVertex2f(1.0, 1.0);
  28.     glTexCoord2f(0.0, 1.0);  glVertex2f(0.0, 1.0);
  29.     glTexCoord2f(0.0, 0.0);  glVertex2f(0.0, 0.0);
  30.     glEnd();
  31.     glDisable(GL_TEXTURE_2D);
  32.    
  33.     glutSwapBuffers();
  34. }
  35.  
  36.  
  37. /* 個々のプログラム独自に行なうべき初期化 */
  38. void myInit(void)
  39. {
  40.     /* ウィンドウ生成前に行なうべき設定 */
  41.     glutInitWindowSize(800, 600);                  // ウィンドウサイズの設定
  42.     glutInitWindowPosition(200, 200);              // 表示位置の設定
  43.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  // ディスプレイモードの設定
  44.     glutCreateWindow("OpenGL");                    // ウィンドウを生成
  45.     glClearColor (0.0, 0.0, 0.0, 1.0);             // ウィンドウの背景色
  46.    
  47.     /* イベント発生時に呼び出される関数の登録 */
  48.     glutDisplayFunc(display);                      // 描画関数(自分自身で定義)を登録
  49.     /* テクスチャの作成 */
  50.     loadImage(IMGFILE);
  51.     glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
  52.     glGenTextures(1, &texture);
  53.     glBindTexture(GL_TEXTURE_2D, texture);
  54.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  55.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  56.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  57.                  width, height, 0, GL_RGB,
  58.                  GL_UNSIGNED_BYTE, image);
  59.     free(image);
  60. }
  61. int main(int argc, char* argv[])
  62. {
  63.     /* 初期化 */
  64.     glutInit(&argc, argv);
  65.     myInit();
  66.    
  67.     /* イベント待機状態に入る */
  68.     glutMainLoop();
  69.    
  70.     return 0;
  71. }
  72.  
  73.  
  74. /* BMP画像の場所を引数にとり、image配列に画像データを格納していく */
  75. void loadImage(const char* filepath)
  76. {
  77.     int i;
  78.     int size;  // 画像のサイズ(幅 * 高さ * 色数)
  79.     FILE* fp;
  80.    
  81.     /* ファイルの読込 */
  82.     fp = fopen(filepath, "rb");
  83.     if (fp == NULL)
  84.     {
  85.         fprintf(stderr, "%sのロードに失敗\n", filepath);
  86.         exit(EXIT_FAILURE);
  87.     }
  88.    
  89.     /* 画像の幅, 高さを取得 */
  90.     fseek(fp, 18, SEEK_SET);  // 画像の幅が格納されている場所までfpを移動
  91.     fread(&width, 4, 1, fp);
  92.     fread(&height, 4, 1, fp);
  93.    
  94.     /* 画像データの読み込み */
  95.     fseek(fp, 54, SEEK_SET);  // 画像データが格納されている場所までfpを移動
  96.     size = width * height * CHANNEL;
  97.     image = (GLubyte* ) malloc(size);
  98.     if (image == NULL)
  99.     {
  100.         fprintf(stderr, "メモリ確保に失敗\n");
  101.         exit(EXIT_FAILURE);
  102.     }
  103.    
  104.     for (i = 0; i < size; ++i)
  105.         fread(&image[i], sizeof(GLubyte), 1, fp);
  106.    
  107.     /* 作業が終わったのでファイルを閉じる */
  108.     fclose(fp);
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement