/* * 透過処理 */ #include GLuint texName[2]; /* 初期化 */ void init(void) { GLfloat lightAmb[] = {0.0, 0.0, 0.0, 1.0}; GLfloat lightPos[] = {0.0, 0.0, -1.0, 1.0}; GLfloat lightDif[] = {10.0, 10.0, 10.0, 1.0}; GLfloat lightDir[] = {0.0, 0.0, -1.0}; glEnable(GL_BLEND); /* 新しい色は GL_SRC_ALPHA で、元の色は GL_ONE_MINUS_SRC_ALPHA で */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* 背景色の指定 R 赤 G 緑 B 青 A 透明度 の順 */ glClearColor(0.0, 0.0, 0.0, 0.0); /* 光源の設定 */ glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDir); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 60.0); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 15.0); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void resize(int w, int h) { /* ビューポートの設定 */ glViewport(0, 0, w, h); /* 射影変換モードに */ glMatrixMode(GL_PROJECTION); /* 変換行列を単位行列に */ glLoadIdentity(); /* 正射影の視野長方形 左、右、下、上、手前、奥 */ glFrustum(-1.33, 1.33, -1.0, 1.0, 1.0, 5.0); /* モデル変換モードに戻す */ glMatrixMode(GL_MODELVIEW); } /* テクスチャ設定 */ void initTexture(void) { /* テクスチャデータ image0 */ GLubyte image0[4][4][3]={ 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255 }; /* テクスチャデータ image1 */ GLubyte image1[4][4][4]={ 255, 0, 0, 255, 255, 0, 0, 255, 255, 255, 255, 200, 255, 255, 255, 200, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 200, 255, 255, 255, 200, 0, 0, 255, 255, 0, 0, 255, 255 }; glGenTextures(2 , texName); glBindTexture(GL_TEXTURE_2D , texName[0]); /* テクスチャの設定 */ glTexImage2D( GL_TEXTURE_2D ,0 /* ミップマップ */ ,3 /* RGBなので3 */ ,4 /* 幅 */ ,4 /* 高さ */ ,0 /* 境界線の幅 */ ,GL_RGB /* RGB形式 */ ,GL_UNSIGNED_BYTE /* 符号無しバイトデータ */ ,image0); /* イメージへのポインタ */ /* S方向に繰り返すGL_REPEAT 打ち切る GL_CLAMP */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /* T方向に繰り返すGL_REPEAT 打ち切る GL_CLAMP */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /* テクスチャの拡大をする 速い GL_NEAREST 綺麗 GL_LINEAR */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* テクスチャの縮小をする 速い GL_NEAREST 綺麗 GL_LINEAR */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /* 元の面の色への対応 反映 GL_MODULATE 無視 GL_DECAL */ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBindTexture(GL_TEXTURE_2D , texName[1]); /* テクスチャの設定 */ glTexImage2D( GL_TEXTURE_2D ,0 /* ミップマップ */ ,4 /* RGBAなので4 */ ,4 /* 幅 */ ,4 /* 高さ */ ,0 /* 境界線の幅 */ ,GL_RGBA /* RGBA形式 */ ,GL_UNSIGNED_BYTE /* 符号無しバイトデータ */ ,image1); /* イメージへのポインタ */ /* S方向に繰り返すGL_REPEAT 打ち切る GL_CLAMP */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /* T方向に繰り返すGL_REPEAT 打ち切る GL_CLAMP */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /* テクスチャの拡大をする 速い GL_NEAREST 綺麗 GL_LINEAR */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* テクスチャの縮小をする 速い GL_NEAREST 綺麗 GL_LINEAR */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /* 元の面の色への対応 反映 GL_MODULATE 無視 GL_DECAL */ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } void deinitTexture(void) { /* テクスチャの解放 */ glDeleteTextures(2 , texName); } /* 画面表示 */ void display(void) { int i, t; /* 背景色でクリア */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslated(0.0, 0.0, -3.0); glPushMatrix(); /* glRotated(180.0, 0.0, 0.0, 1.0); */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D , texName[0]); /* 市松模様の床 */ glBegin(GL_QUADS); glNormal3d(0.0, 0.0, 1.0); for(t = 0; t < 20;t++){ for(i = 0; i < 28;i++){ glTexCoord2f(0.0, 0.0); glVertex3d(-7.0 + i * 0.5, 5.0 - t * 0.5, -2.0); glTexCoord2f(1.0, 0.0); glVertex3d(-7.0 + i * 0.5, 4.5 - t * 0.5, -2.0); glTexCoord2f(1.0, 1.0); glVertex3d(-6.5 + i * 0.5, 4.5 - t * 0.5, -2.0); glTexCoord2f(0.0, 1.0); glVertex3d(-6.5 + i * 0.5, 5.0 - t * 0.5, -2.0); } } glEnd(); glBindTexture(GL_TEXTURE_2D , texName[1]); /* 赤と青の板 */ glBegin(GL_QUADS); glNormal3d(0.0, 0.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3d(-0.5, 0.5, 0.0); glTexCoord2f(0.0, 1.0); glVertex3d(-0.5, -0.5, 0.0); glTexCoord2f(1.0, 1.0); glVertex3d(0.5, -0.5, 0.0); glTexCoord2f(1.0, 0.0); glVertex3d(0.5, 0.5, 0.0); glEnd(); glDisable(GL_TEXTURE_2D); glPopMatrix(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowPosition(100, 50); glutInitWindowSize(400, 300); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); /* 各関数の指定 */ glutDisplayFunc(display); glutReshapeFunc(resize); /* 初期化 */ init(); /* テクスチャ準備 */ initTexture(); /* メインループ */ glutMainLoop(); /* テクスチャ後片付け */ deinitTexture(); return 0; }