###前提・実現したいこと
OpenGLを使って簡単なCGを作っています。
2つアニメーションを実装している立方体があるうち、中心の立方体の6面にストラクチャを貼ろうとしたところ、実行時エラーが発生しました。
試しに、1つのポリゴンを表示するようにしているところです。
###発生している問題・エラーメッセージ
テクスチャの画像に下の実行結果のようなノイズが入ってしまう。
###該当のソースコード
c
1#include <stdio.h> 2#include <GLUT/glut.h> 3#include <stdlib.h> 4 5#define KEY_ESC 27 6 7/*Gold*/ 8float diffuse[]={0.7, 0.6, 0.2, 1.0}; //拡散反射成分(R,G,B,A強度0.0〜1.0) 9float specular[]={0.6, 0.5, 0.4, 1.0}; //鏡面反射成分(R,G,B,A強度0.0〜1.0) 10float ambient[]={0.3,0.2,0.1,1.0}; //環境光反射成分(R,G,B,A強度0.0〜1.0) 11float shininess=10.0; //鏡面光の鋭さ(0.0〜128.0) 12 13double param_big = 0.0; 14double param_small = 0.5; 15 16/* Texture */ 17#define TEXWIDTH 256 18#define TEXHEIGHT 256 19//#define TEXWIDTH 512 20//#define TEXHEIGHT 512 21static const char texture1[] = "./image01.data"; 22//static const char texture2[] = "sample.data"; 23 24void myKbd(unsigned char key,int x, int y){ 25 if(key==KEY_ESC)exit(0); 26} 27void texture_map(void){ 28 // --------- テクスチャマッピング開始 ------------- 29 glEnable(GL_TEXTURE_2D); 30 glNormal3d(0.0,0.0,1.0); //法線ベクトルの設定 31 glBegin(GL_QUADS); 32 glTexCoord2d(0,1); glVertex3d(-1,-1,0); //左下 33 glTexCoord2d(1,1); glVertex3d(1,-1,0); //左上 34 glTexCoord2d(1,0); glVertex3d(1,1,0); //右上 35 glTexCoord2d(0,0); glVertex3d(-1,1,0); //右下 36 //上面 37// glTexCoord2d(0.0,1); glVertex3d(0.0,0.0,0.0); //左下 38// glTexCoord2d(0.0,0.0); glVertex3d(1,0.0,0); //左上 39// glTexCoord2d(1,0.0); glVertex3d(1,0,-1); //右上 40// glTexCoord2d(1,1); glVertex3d(0,0.0,-1); //右下 41 //底面 42// glTexCoord2d(0.0,0.5); glVertex3d(0,-0.5,0); //左下 43// glTexCoord2d(0.0,0.0); glVertex3d(0,-0.5,-0.5); //左上 44// glTexCoord2d(0.5,0.0); glVertex3d(0.5,-0.5,-0.5); //右上 45// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,0.0); //右下 46// //左側 47// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,0.0); //左下 48// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,0.0); //左上 49// glTexCoord2d(0.5,0.0); glVertex3d(0.0,0.0,-0.5); //右上 50// glTexCoord2d(0.5,0.5); glVertex3d(0.0,-0.5,-0.5); //右下 51// //奥側 52// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,-0.5); //左下 53// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,-0.5); //左上 54// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0.0,-0.5); //右上 55// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,-0.5); //右下 56// //右側 57// glTexCoord2d(0.0,0.5); glVertex3d(0.5,-0.5,0.0); //左下 58// glTexCoord2d(0.0,0.0); glVertex3d(0.5,0.0,0.0); //左上 59// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0,-0.5); //右上 60// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,-0.5); //右下 61// //手前側 62// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,0.0); //左下 63// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,0.0); //左上 64// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0.0,0.0); //右上 65// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,0.0); //右下 66 glEnd(); 67 glDisable(GL_TEXTURE_2D); 68 // --------- テクスチャマッピング終了 ------------- 69} 70void display(void){ // ディスプレイコールバック関数 71 72 // -------いつも必要な関数---------------- 73 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //デプスバッファの設定(隠面消去のため) 74 glEnable(GL_DEPTH_TEST); 75 glPushMatrix(); 76 // ------------------------------------ 77 78 gluLookAt(3.0, 3.0, 5.0, // 視点の位置 79 0.0, 0.0, 0.0, // 見たいものの位置 80 0.0, 1.0, 0.0); // 画像のどこが上なのかを指定(ベクトル) 81 glColor4f(0.0,0.0,0.0,1.0); 82 83 // --------- 外側の直方体 回転 ------------------ 84 glPushMatrix(); //現在の座標系を保存 85 glRotatef(45.0*(float)param_big,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 86 87 88 glPushMatrix(); //回転した状態の座標系を保存 89 glTranslatef(0.0,0.0,-1.0); //座標系を平行移動 90 91 //課題2 92 glPushMatrix(); //現在の座標系を保存 93 glRotatef(-45.0*(float)param_big,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 94 // -------------------------------------------- 95 96 //立方体の描画(外側) 97 glLineWidth(2.0); 98 glutWireCube(2.0); 99 100 glPopMatrix(); //平行移動前の座標系を復元 101 glPopMatrix(); //平行移動も回転もしていない元の座標系を復元 102 glPopMatrix(); 103 104 // 照明をON 105 // glEnable(GL_LIGHT0); 106 // glEnable(GL_LIGHTING); 107 108 //表面属性の設定 109 glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse); 110 glMaterialfv(GL_FRONT,GL_SPECULAR,specular); 111 glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); 112 glMaterialf(GL_FRONT,GL_SHININESS,shininess); 113 114 115 // ------ 中心の直方体 回転 ----------- 116 glPushMatrix(); //現在の座標系を保存 117 glRotatef(-45.0*(float)param_small,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 118 119 120 glPushMatrix(); //回転した状態の座標系を保存 121 glTranslatef(0.0,0.0,-1.0); //座標系を平行移動 122 123 glPushMatrix(); //現在の座標系を保存 124 glRotatef(45.0*(float)param_small,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 125 // ---------------------------- 126 127 texture_map(); 128 129 glPopMatrix(); //平行移動前の座標系を復元 130 glPopMatrix(); //平行移動も回転もしていない元の座標系を復元 131 glPopMatrix(); 132 133 glPopMatrix(); //座標系の復帰 134 glDisable(GL_DEPTH_TEST); //デプスバッファ更新を無効にする(隠面消去OFF) 135 glutSwapBuffers(); 136} 137void myReshape(int width, int height){ 138 double aspect = (double)width/(double)height; 139 140 glViewport(0,0,width,height); 141 glMatrixMode(GL_PROJECTION); 142 glLoadIdentity(); 143 gluPerspective(30.0,aspect,1.0,100.0); //透視投影の設定 144 glMatrixMode(GL_MODELVIEW); 145} 146 147void myMouse(int button,int state, int x,int y){ //マウスコールバック関数 148 if(state == GLUT_DOWN){ 149 switch(button){ 150 case GLUT_LEFT_BUTTON: 151 exit(-1);break; 152 } 153 } 154} 155void init(char *progname){ //初期化関数 156 int width = 500, height = 500; 157 158 glutInitWindowPosition(0,0); 159 glutInitWindowSize(width,height); 160 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //デプスバッファの設定(隠面消去のため) 161 glutCreateWindow(progname); 162 glClearColor(1.0,1.0,1.0,1.0); 163 164//テクスチャ画像の読み込み 165GLubyte texture[TEXHEIGHT][TEXWIDTH][3]; 166FILE *fp; 167if((fp=fopen("./image01.data","rb")) != NULL){ 168 fread(texture, sizeof texture, 1,fp); 169 fclose(fp); 170}else{ 171 // 任意のエラー処理を記述 172 perror(texture1); 173} 174glPixelStorei(GL_UNPACK_ALIGNMENT,1); //アライメント(データの格納方法)の設定 175 176glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXWIDTH, TEXHEIGHT, 0, 177 GL_RGB, GL_UNSIGNED_BYTE, texture); //画像データをテクスチャメモリにセットする 178 179//テクスチャパラメータの設定(テクスチャマッピングの拡大・縮小法の設定) 180glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 181glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 182 183//テクスチャの合成環境の設定(ポリゴンの陰影等をテクスチャに反映する等の設定) 184glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); 185} 186 187void idle(void){ 188 param_big +=0.1; 189 param_small += 0.05; 190 glutPostRedisplay(); 191} 192 193int main(int argc,char *argv[]){ //メイン関数 194 glutInit(&argc,argv); 195 196 init(argv[0]); 197 glutReshapeFunc(myReshape); 198 glutDisplayFunc(display); 199 glutKeyboardFunc(myKbd); 200 glutMouseFunc(myMouse); 201 //課題3 202 glutIdleFunc(idle); 203 glutMainLoop(); 204 205 return 0; 206} 207
実行結果
###補足情報(言語/FW/ツール等のバージョンなど)
C言語

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/22 03:37
2018/01/22 04:03
2018/01/22 05:49
2018/01/22 07:22
2018/01/22 08:00
2018/01/22 08:26
2018/01/22 13:32
2018/01/22 13:57 編集
2018/01/22 22:04
2018/01/22 22:52
2018/01/23 04:05
2018/01/23 04:37