ページ中ほどの、「回転を止めよう」という前までのプログラムをコンパイルしたのですが、
エラー 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;
}