OpenGL キューブマッピングでエラーが出ます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DOG
記事: 27
登録日時: 11年前

OpenGL キューブマッピングでエラーが出ます

#1

投稿記事 by DOG » 11年前

現在、このページ(http://marina.sys.wakayama-u.ac.jp/~tok ... e=20050121)でキューブマッピングについて学習しています。
ページ中ほどの、「回転を止めよう」という前までのプログラムをコンパイルしたのですが、
エラー E2451 main6.cpp 29: 未定義のシンボル GL_TEXTURE_CUBE_MAP_NEGATIVE_X
エラー E2304 main6.cpp 30: <定数> 変数 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Y' には初期化が必要
エラー E2304 main6.cpp 31: <定数> 変数 'GL_TEXTURE_CUBE_MAP_NEGATIVE_Z' には初期化が必要
エラー E2304 main6.cpp 32: <定数> 変数 'GL_TEXTURE_CUBE_MAP_POSITIVE_X' には初期化が必要
エラー E2304 main6.cpp 33: <定数> 変数 'GL_TEXTURE_CUBE_MAP_POSITIVE_Y' には初期化が必要
エラー E2304 main6.cpp 34: <定数> 変数 'GL_TEXTURE_CUBE_MAP_POSITIVE_Z' には初期化が必要
エラー E2040 main6.cpp 35: 宣言が正しく終了していない
エラー E2190 main6.cpp 35: 不要な }
エラー E2190 main6.cpp 35: 不要な }
エラー E2451 main6.cpp 74: 未定義のシンボル GL_TEXTURE_CUBE_MAP(関数 init() )
エラー E2451 main6.cpp 104: 未定義のシンボル GL_REFLECTION_MAP(関数 init() )
エラー E2451 main6.cpp 142: 未定義のシンボル GL_TEXTURE_CUBE_MAP(関数 scene() )
というエラーが出てきます。ちゃんとサンプルどうりに打ち込んでいるはずなのに、なぜこのようなエラーが出てしまうのでしょうか?
少々長いですが、以下にプログラムを載せます。

コード:

#include <stdio.h>
#include <math.h>
#if defined(WIN32)
//#  pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#  include "glut.h"
#include "glext.h"
#elif defined(__APPLE__) || defined(MACOSX)
#  include <GLUT/glut.h>
#else
#  include <GL/glut.h>
#endif

/*
** 光源
*/
static const GLfloat lightpos[] = { 0.0, 0.0, 1.0, 0.0 }; /* 位置    */
static const GLfloat lightcol[] = { 1.0, 1.0, 1.0, 1.0 }; /* 直接光強度 */
static const GLfloat lightamb[] = { 0.1, 0.1, 0.1, 1.0 }; /* 環境光強度 */

/*
** テクスチャ
*/
#define TEXWIDTH  256                      /* テクスチャの幅    */
#define TEXHEIGHT 256                      /* テクスチャの高さ   */
static const char texture1[] = "room.raw"; /* テクスチャファイル名 */

static const GLenum target[] = {
	GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
	GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
	GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
	GL_TEXTURE_CUBE_MAP_POSITIVE_X,
	GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
	GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
};

#if 0
static double genfunc[][4] = {   /* テクスチャ生成関数のパラメータ */
  { 1.0, 0.0, 0.0, 0.0 },
  { 0.0, 1.0, 0.0, 0.0 },
  { 0.0, 0.0, 1.0, 0.0 },
  { 0.0, 0.0, 0.0, 1.0 },
};
#endif

/*
** 初期化
*/
static void init(void)
{
  /* テクスチャの読み込みに使う配列 */
  GLubyte texture[TEXHEIGHT][TEXWIDTH][4];
  FILE *fp;
  
  /* テクスチャ画像の読み込み */
  if ((fp = fopen(texture1, "rb")) != NULL) {
    fread(texture, sizeof texture, 1, fp);
    fclose(fp);
  }
  else {
    perror(texture1);
  }
  
  /* テクスチャ画像はバイト単位に詰め込まれている */
  glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
  
  /* テクスチャの割り当て */
  for(int i = 0; i < 6; ++i){
  glTexImage2D(target[i], 0, GL_RGBA, TEXWIDTH, TEXHEIGHT, 0,
               GL_RGBA, GL_UNSIGNED_BYTE, texture);
  }
  
  /* テクスチャを拡大・縮小する方法の指定 */
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  
  /* テクスチャの繰り返し方法の指定 */
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP);
  
  /* テクスチャ環境 */
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  
#if 0
  /* 混合する色の設定 */
  static const GLfloat blend[] = { 0.0, 1.0, 0.0, 1.0 };
  glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, blend);
#endif
  
#if 0
  /* 頂点のオブジェクト空間における座標値を使ってマッピングする */
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  
  /* テクスチャ座標生成関数の設定 */
  glTexGendv(GL_S, GL_OBJECT_PLANE, genfunc[0]);
  glTexGendv(GL_T, GL_OBJECT_PLANE, genfunc[1]);
  glTexGendv(GL_R, GL_OBJECT_PLANE, genfunc[2]);
  glTexGendv(GL_Q, GL_OBJECT_PLANE, genfunc[3]);
#else
  /* キューブ・マッピング用のテクスチャ座標を生成する */
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
#endif
  
  /* アルファテストの判別関数 */
  glAlphaFunc(GL_GREATER, 0.5);
  
  /* 初期設定 */
  glClearColor(0.3, 0.3, 1.0, 0.0);
  glEnable(GL_DEPTH_TEST);
  glDisable(GL_CULL_FACE);
  
  /* 光源の初期設定 */
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcol);
  glLightfv(GL_LIGHT0, GL_SPECULAR, lightcol);
  glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
}

/* 箱を描く関数の宣言 */
#include "box.h"

/*
** シーンの描画
*/
static void scene(void)
{
  static const GLfloat color[] = { 1.0, 1.0, 1.0, 1.0 };  /* 材質 (色) */
  
  /* 材質の設定 */
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
  
  /* アルファテスト開始 */
  glEnable(GL_ALPHA_TEST);
  
  /* テクスチャマッピング開始 */
  glEnable(GL_TEXTURE_CUBE_MAP);
  
  /* テクスチャ座標の自動生成を有効にする */
  glEnable(GL_TEXTURE_GEN_S);
  glEnable(GL_TEXTURE_GEN_T);
  glEnable(GL_TEXTURE_GEN_R);
#if 0
  glEnable(GL_TEXTURE_GEN_Q);
#endif

#if 0
  /* 箱を描く */
  box(1.0, 1.0, 1.0);
#else
  /* ティーポットを描く */
  glutSolidTeapot(1.0);
#endif

  /* テクスチャ座標の自動生成を無効にする */
  glDisable(GL_TEXTURE_GEN_S);
  glDisable(GL_TEXTURE_GEN_T);
  glDisable(GL_TEXTURE_GEN_R);
#if 0
  glDisable(GL_TEXTURE_GEN_Q);
#endif
  
  /* テクスチャマッピング終了 */
  glDisable(GL_TEXTURE_CUBE_MAP);
  
  /* アルファテスト終了 */
  glDisable(GL_ALPHA_TEST);
}


/****************************
** GLUT のコールバック関数 **
****************************/

/* トラックボール処理用関数の宣言 */
#include "trackball.h"

/* アニメーションのサイクル */
#define FRAMES 360

static void display(void)
{
  /* フレーム数をカウントして時間として使う */
  static int frame = 0;                      /* フレーム数        */
  double t = (double)frame / (double)FRAMES; /* 時間とともに 0→1 に変化 */
  
  if (++frame >= FRAMES) frame = 0;
  
  /* テクスチャ行列の設定 */
  glMatrixMode(GL_TEXTURE);
  glLoadIdentity();
  glTranslated(0.5, 0.5, 0.0);
  glRotated(t * 360.0, 0.0, 0.0, 1.0);
#if 0
  glScaled(0.5, 0.5, 1.0);
  gluPerspective(60.0, 1.0, 1.0, 100.0);
  gluLookAt(0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
#else
  glTranslated(-0.5, -0.5, 0.0);
#endif
  
  /* モデルビュー変換行列の設定 */
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  
  /* 光源の位置を設定 */
  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  
  /* 視点の移動(物体の方を奥に移動)*/
  glTranslated(0.0, 0.0, -3.0);
  
  /* トラックボール処理による回転 */
  glMultMatrixd(trackballRotation());
  
  /* 画面クリア */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
  /* シーンの描画 */
  scene();
  
  /* ダブルバッファリング */
  glutSwapBuffers();
}

static void resize(int w, int h)
{
  /* トラックボールする範囲 */
  trackballRegion(w, h);
  
  /* ウィンドウ全体をビューポートにする */
  glViewport(0, 0, w, h);
  
  /* 透視変換行列の指定 */
  glMatrixMode(GL_PROJECTION);
  
  /* 透視変換行列の初期化 */
  glLoadIdentity();
  gluPerspective(60.0, (double)w / (double)h, 1.0, 100.0);
}

static void idle(void)
{
  /* 画面の描き替え */
  glutPostRedisplay();
}

static void mouse(int button, int state, int x, int y)
{
  switch (button) {
  case GLUT_LEFT_BUTTON:
    switch (state) {
    case GLUT_DOWN:
      /* トラックボール開始 */
      trackballStart(x, y);
      break;
    case GLUT_UP:
      /* トラックボール停止 */
      trackballStop(x, y);
      break;
    default:
      break;
    }
    break;
    default:
      break;
  }
}

static void motion(int x, int y)
{
  /* トラックボール移動 */
  trackballMotion(x, y);
}

/*
** メインプログラム
*/
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
  glutCreateWindow(argv[0]);
  glutDisplayFunc(display);
  glutReshapeFunc(resize);
  glutIdleFunc(idle);
  glutMouseFunc(mouse);
  glutMotionFunc(motion);
  init();
  glutMainLoop();
  return 0;
}
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: OpenGL キューブマッピングでエラーが出ます

#2

投稿記事 by みけCAT » 11年前

提示されたプログラムの

コード:

/*
** 光源
*/
の直前の行(#if~#endifの外)に

コード:

#include "glext.h"
を追加してみてください。
前提として、きちんと指定されたglext.hを入れていますね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

DOG
記事: 27
登録日時: 11年前

Re: OpenGL キューブマッピングでエラーが出ます

#3

投稿記事 by DOG » 11年前

指定され場所に置いたらコンパイルできました!
#if~#endifの外に置かなければならなかったのですね。
しかし、なぜこの外側に置く必要があるのでしょうか?
#if 0 ~ #endif で挟んだプログラムは無効化出来ることは知っていますが、#if~#endifは特に無効化しているわけではなさそうですよね。。。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: OpenGL キューブマッピングでエラーが出ます

#4

投稿記事 by へにっくす » 11年前

これ参考になるかな。

http://vgr.blog8.fc2.com/blog-entry-69.html

#if definedの意味をよく知っておくべきです。
written by へにっくす

DOG
記事: 27
登録日時: 11年前

Re: OpenGL キューブマッピングでエラーが出ます

#5

投稿記事 by DOG » 11年前

へにっくすさん。返答ありがとうございます。
教えてくださったページを参考にプリプロセスについて調べてみると分かったような気がしますが、本当に分かっているか心配なので確認させてください。

//////////////////////////////////
このプログラムで、
#if defined(WIN32)~#elif defined(_APPLE_) || defined(MACOSX)~#else~#endif
の中で有効になっているのは、
#else~#endif
の部分であるから結果的にインクルードされているヘッダファイルは、
stdio.h
math.h
GL/glut.h
のみということになる。
したがって、最初私がインクルードしたつもりのglext.h はこのプログラムでは無効になっている
#if defined(WIN32)~#elif defined(_APPLE_) || defined(MACOSX) に書いてしまったため
glext.hがインクルードされずにエラーを吐いてしまった。
//////////////////////////////////

という解釈でよろしいのでしょうか?

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: OpenGL キューブマッピングでエラーが出ます

#6

投稿記事 by へにっくす » 11年前

はい、その通りです。
#if definedにぶつかるまでに
#define で定義しているか、
コンパイラのオプションで定義マクロをセットしてやらないと、
あなたが解釈した通りになります。
written by へにっくす

DOG
記事: 27
登録日時: 11年前

Re: OpenGL キューブマッピングでエラーが出ます

#7

投稿記事 by DOG » 11年前

みけCATさん、へにっくすさん。
おかげさまで、また一歩プログラミングの知識を増やすことができました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る