計算機設定/VisualStudio2005/OpenGL - PukiWiki

計算機設定/VisualStudio2005

2008/11/27

OpenGL: テクスチャーを使ったサンプルプログラム

4角形に写真を貼り付けて左マウスクリックで回転させます.

ym1.jpg ym3.jpg ym4.jpg ym2.jpg

  • 準備
    • プロジェクト内でメインプログラムに下記のmain.cの内容をカット&ペーストして下さい.
    • 画像ファイル fileym.raw をプロジェクトのソースファイルと同じフォルダ内にダウンロードして下さい.
      (右クリック, 対象をファイルに保存, テキスト・ドキュメントでなく, 全てのファイルを表示して, ym.rawの名前で保存する.)
    • OpenGLのヘッダーファイルとライブラリファイル(glut.h, glut32.lib, glut32.dll)をソースファイルと同じフォルダに入れて下さい.
  • main.c
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "glut.h"
    void idle(void)
    {
      glutPostRedisplay();
    }
    void display(void)
    {
      static int r = 0; /* 回転角 */
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
      /* 視点位置と視線方向 視点 (0,4,5), 目標点 (0,0,0) 最後の(0,1,0)はy軸が上 */
      gluLookAt(0.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
      /* 図形の回転(r++)度 右がx軸 上がy軸 手前がz軸 (0,1,0)はy軸中心の回転 */
      glRotated((double)(r++), 0.0, 1.0, 0.0);
      /* 図形の描画 (0,0,0)は色(r,g,b)の強さ */
      glColor3d(0.0, 0.0, 0.0); 
    	/* 4角形を描画する */
           /* テクスチャの (0,1)-(1,1)-(1,0)-(0,0) を */
           /* 3次元空間の  (0,0,0)-(1,0,0)-(1,1,0)-(0,1,0) に貼り付ける */
    	glEnable(GL_TEXTURE_2D);
    	glBegin(GL_QUADS);
    	glTexCoord2d(0.0, 1.0);
    	glVertex3d(0.0, 0.0, 0.0);
    	glTexCoord2d(1.0, 1.0);
    	glVertex3d(1.0, 0.0, 0.0);
    	glTexCoord2d(1.0, 0.0);
    	glVertex3d(1.0, 1.0, 0.0);
    	glTexCoord2d(0.0, 0.0);
    	glVertex3d(0.0, 1.0, 0.0);
    	glEnd();
    	glDisable(GL_TEXTURE_2D);
      /* 今描いた画面を前の画面と入れ替える */
      glutSwapBuffers();
      /* 一周回ったら回転角を 0 に戻す */
      if (r == 360) r = 0;
    }
    void resize(int w, int h)
    {
      glViewport(0, 0, w, h);
      /* 透視変換行列の設定 */
      glMatrixMode(GL_PROJECTION);
      /* 変換行列の初期化 */
      glLoadIdentity();
      /* カメラの画角30度(視界), w/h は画面の縦横比, 奥行き(1,100)の範囲を描画 */
      gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
      /* モデルビュー変換行列の設定 */
      glMatrixMode(GL_MODELVIEW);
    }
    void mouse(int button, int state, int x, int y)
    {
      switch (button) {
      case GLUT_LEFT_BUTTON:
        if (state == GLUT_DOWN) {
           glutIdleFunc(idle); 
    	}
    	else {
          glutIdleFunc(0);
        }
      }
    }
    void keyboard(unsigned char key, int x, int y)
    {
      switch (key) {
      case 'q':
        exit(0);
      }
    }
    void init(void)
    { 
    	GLubyte texture[256][256][3]; 
    	FILE *fp;
    	if ((fp=fopen("ym.raw","rb"))!=NULL) {
    		fread(texture, sizeof texture, 1, fp);
    		fclose(fp);
    	} else {
    		perror("ym.raw not found!!\n");
    	}
    	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    	glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,  texture);
    	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
      glClearColor(1.0, 1.0, 1.0, 0.0);
      glEnable(GL_DEPTH_TEST);
    }
    int main(int argc, char *argv[])
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
      glutCreateWindow(argv[0]);
      glutDisplayFunc(display);
      glutReshapeFunc(resize);
      glutMouseFunc(mouse);
      glutKeyboardFunc(keyboard);
      init();
      glutMainLoop();
      return 0;
    }
  • 画像ファイル

Mac OS X の場合

  • main.c
    • #include "glut.h" は #include <GLUT/glut.h> とする.
  • Makefile
    CC = gcc
    LDFLAGS = -framework OpenGL -framework GLUT -framework Foundation
    main: main.o

Counter: 2309, today: 1, yesterday: 1

添付ファイル: fileym4.jpg 565件 [詳細] fileym3.jpg 503件 [詳細] fileym1.jpg 569件 [詳細] fileym2.jpg 540件 [詳細] fileym.raw 732件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSSPDF
Last-modified: 2008-11-27 (木) 20:33:22 (3888d)