Advertisement
Kojima0502

OpenGL_bitmap_texture2

Jan 26th, 2014
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <GLUT/glut.h>
  4.  
  5.  
  6. /* 画像についての情報を保存しておく変数・定数 */
  7. #define IMGFILE "sample.bmp"
  8. #define CHANNEL 3 // 画像の色数(R, G, B)
  9. int width; // 画像の幅
  10. int height; // 画像の高さ
  11. GLuint texture; // テクスチャの識別番号
  12. GLubyte* image; // ビットマップ画像データを格納
  13. float shiftX,shiftY;
  14. float mouseX,mouseY;
  15. float x,y;
  16. float a;
  17. float g_pressed = 0;
  18. /* 関数のプロトタイプ宣言 */
  19. void loadImage(const char* filepath); // BMP 画像を読み込む
  20.  
  21.  
  22. void display(void)
  23. {
  24. glClear(GL_COLOR_BUFFER_BIT);
  25.  
  26. /* 画像の表示 */
  27. glEnable(GL_TEXTURE_2D);
  28. glBindTexture(GL_TEXTURE_2D, texture);
  29. glBegin(GL_QUADS);
  30. glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
  31. glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
  32. glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
  33. glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
  34. glEnd();
  35. //glClear(GL_COLOR_BUFFER_BIT);
  36.  
  37. glDisable(GL_TEXTURE_2D);
  38.  
  39. glColor3d(0.0, 0.0, 0.0);//色
  40. glBegin(GL_LINE_LOOP);
  41.  
  42. x=0.1;
  43. y=0.1;
  44.  
  45. glVertex2d(-x, -y);//位置
  46. glVertex2d(x, -y);//位置
  47. glVertex2d(x, y);//位置
  48. glVertex2d(-x, y);//位置
  49.  
  50. glEnd();
  51. glTranslatef(shiftX,shiftY,0);
  52. glutSwapBuffers();
  53.  
  54.  
  55. //glFlush();
  56.  
  57. }
  58.  
  59.  
  60. /* 個々のプログラム独自に行なうべき初期化 */
  61. void myInit(void)
  62. {
  63. /* ウィンドウ生成前に行なうべき設定 */
  64. glutInitWindowSize(800, 600); // ウィンドウサイズの設定
  65. glutInitWindowPosition(0, 0); // 表示位置の設定
  66. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // ディスプレイモードの設定
  67. glutCreateWindow("OpenGL"); // ウィンドウを生成
  68. glClearColor (0.0, 0.0, 0.0, 1.0); // ウィンドウの背景色
  69.  
  70. /* イベント発生時に呼び出される関数の登録 */
  71. glutDisplayFunc(display); // 描画関数(自分自身で定義)を登録
  72. /* テクスチャの作成 */
  73. loadImage(IMGFILE);
  74. glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
  75. glGenTextures(1, &texture);
  76. glBindTexture(GL_TEXTURE_2D, texture);
  77. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  78. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  79. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  80. width, height, 0, GL_RGB,
  81. GL_UNSIGNED_BYTE, image);
  82. free(image);
  83. }
  84.  
  85. void keyboard(unsigned char key, int x, int y)
  86. {
  87. switch (key) {
  88. case 'q':
  89. case 'Q':
  90. case '\033': /* '\033' は ESC の ASCII コード */
  91. exit(0);
  92. default:
  93. break;
  94. }
  95. }
  96.  
  97.  
  98. void mouse(int btn, int state, int x, int y)
  99. {
  100.  
  101.  
  102. if(btn == GLUT_LEFT_BUTTON == state == GLUT_DOWN)
  103. {
  104.  
  105. mouseX = x;
  106. mouseY = y;
  107. g_pressed = 1;
  108. }
  109. else if(btn == GLUT_LEFT_BUTTON == state ==GLUT_UP)
  110. {
  111. g_pressed = 0;
  112.  
  113. }
  114. }
  115.  
  116. void motion(int x, int y)
  117. {
  118. {
  119.  
  120. shiftX = (float)((x - mouseX)/1000);
  121. shiftY = (float)(-(y - mouseY)/1000);
  122.  
  123. glutPostRedisplay();
  124.  
  125. }
  126.  
  127. printf("X = %d : Y = %d\n" , x , y);//カーソルの座標を表示
  128. printf("ShiftX = %f : ShiftY = %f\n" , shiftX , shiftY);//移動量を表示
  129.  
  130.  
  131. }
  132.  
  133.  
  134. int main(int argc, char* argv[])
  135. {
  136. /* 初期化 */
  137. glutInit(&argc, argv);
  138. myInit();
  139. glutDisplayFunc(display);//描画処理が必要なとき。
  140. glutKeyboardFunc(keyboard);//キーボードの入力があったとき。
  141. glutMouseFunc(mouse);//マウスボタンが押されたか離されたとき。
  142. glutMotionFunc(motion);//マウスでドラッグが行われているとき。
  143. /* イベント待機状態に入る */
  144. glutMainLoop();
  145.  
  146. return 0;
  147. }
  148.  
  149.  
  150. /* BMP画像の場所を引数にとり、image配列に画像データを格納していく */
  151. void loadImage(const char* filepath)
  152. {
  153. int i;
  154. int size; // 画像のサイズ(幅 * 高さ * 色数)
  155. FILE* fp;
  156.  
  157. /* ファイルの読込 */
  158. fp = fopen(filepath, "rb");
  159. if (fp == NULL)
  160. {
  161. fprintf(stderr, "%sのロードに失敗\n", filepath);
  162. exit(EXIT_FAILURE);
  163. }
  164.  
  165. /* 画像の幅, 高さを取得 */
  166. fseek(fp, 18, SEEK_SET); // 画像の幅が格納されている場所までfpを移動
  167. fread(&width, 4, 1, fp);
  168. fread(&height, 4, 1, fp);
  169.  
  170. /* 画像データの読み込み */
  171. fseek(fp, 54, SEEK_SET); // 画像データが格納されている場所までfpを移動
  172. size = width * height * CHANNEL;
  173. image = (GLubyte* ) malloc(size);
  174. if (image == NULL)
  175. {
  176. fprintf(stderr, "メモリ確保に失敗\n");
  177. exit(EXIT_FAILURE);
  178. }
  179.  
  180. for (i = 0; i < size; ++i)
  181. fread(&image[i], sizeof(GLubyte), 1, fp);
  182.  
  183. /* 作業が終わったのでファイルを閉じる */
  184. fclose(fp);
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement