• 締切済み

GLが透けてしまいます

OpenGLでオブジェクトを作成して,隠面除去を行ないました。 が、奥にあるはずの部分が何故か透けて(?)見えています。 この原因は何でしょうか。 どうすれば奥の部分が見えなくなりますか? 分かる方、教えてください。

みんなの回答

回答No.1

OpenGL の消去というと、Depthテストを有効にしたのでしょうか? もしかしたらカリングのことでしょうか。 透けるというとブレンディングが有効になっていますか? 実際のソースコードを、問題が再現される程度に なるべくシンプルにして提示いただくのが、 解決への最良の近道だと思います。 スクリーンショットもあれば申し分ありません。

hirubanasa
質問者

補足

ご回答ありがとうございます。 内容は円柱に画像を貼り付けるというものです。 円柱に凹凸を付けたく、試しにソース内の/****/で囲まれた所で値を変えています。 以前は透けている感じはなかったのですが、改良しているうちに透けているのが分かりました。 同時に変更していない回転の方向や見る角度も変わってしまいました(見下ろしていたのが見上げているように)。 ソース自体長く、複雑になってしまったので、改良したところを中心に載せ、SSも追加させていただきます。 また下記サイトを基に組んだのですが、そこではブレンディングとやらを行なっていない様子です。(詳しくは分かりませんが) http://www.center.wakayama-u.ac.jp/~tokoi/opengl/libglut.html​ void display(void){  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//デプスバッファ  glLoadIdentity();  /* 視点位置と視線方向 */  gluLookAt(-3.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  /* 回転 */  glRotated((double)r, 0.0, 1.0, 0.0);  /* 描画 */  glColor3d(0.0, 0.0, 0.0);  glBegin(GL_QUADS);  for ( j = 0; j < (psize-1)*(psize-1); ++j ) {   glColor3dv( bgr[j] );   for ( i = 0; i < 4; ++i ) {    glVertex3dv(vertex[face[j][i]]);   }  }  glEnd();  glutSwapBuffers();  /* 一周回ったら回転角を 0 に戻す */  if ( ++r >= 360 ) r = 0; } void init(void){  glClearColor(1.0, 1.0, 1.0, 1.0);  glEnable(GL_DEPTH_TEST);  glEnable(GL_CULL_FACE);  glCullFace(GL_BACK); } /*円柱*/ void entyu(){  //極座標で xz面に円をつくる  k= 2 * rad + 1;  np = 4 * rad;  pi = acos( -1.0 );  dt = 2 * pi / np;  for( kp = 1; kp <= np; kp++ ){   tt = dt * kp;   x[ k ] = cos( tt );   z[ k ] = sin( tt );   k++;   if( k == 4 * rad )    k = 0;  }  // x, z座標(円)  k = 0;  for( i = 0; i < width; i++ ){   for( j = 0; j < height; j++ ){    vertex[ k + 4 * rad * j ][ 0 ] = x[ i ] * rad;     vertex[ k + 4 * rad * j ][ 2 ] = z[ i ] * rad; /************/      if( i == 0)       vertex[ k + 4 * rad * j ][ 0 ] -= 5;      else if( i == width / 2)       vertex[ k + 4 * rad * j ][ 0 ] += 5; /************/   }   k++;  }  k = 0;  // y座標  for( j = 0; j < height; j++ ){   for( i = 0; i < width; i++ ){    vertex[k][1] = psize - j - psize / 2;    k++;   }  } } //メイン関数 main(int argc, char *argv[]){  /*円柱*/  entyu();  glutInit(&argc, argv);  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);//デプスバッファ  glutCreateWindow(argv[0]);  glutDisplayFunc(display);  glutReshapeFunc(resize);  glutMouseFunc(mouse);  init();  glutMainLoop();  return 0; }

関連するQ&A