- 締切済み
GLが透けてしまいます
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hirusagari
- ベストアンサー率64% (20/31)
回答No.1
OpenGL の消去というと、Depthテストを有効にしたのでしょうか? もしかしたらカリングのことでしょうか。 透けるというとブレンディングが有効になっていますか? 実際のソースコードを、問題が再現される程度に なるべくシンプルにして提示いただくのが、 解決への最良の近道だと思います。 スクリーンショットもあれば申し分ありません。
OpenGL の消去というと、Depthテストを有効にしたのでしょうか? もしかしたらカリングのことでしょうか。 透けるというとブレンディングが有効になっていますか? 実際のソースコードを、問題が再現される程度に なるべくシンプルにして提示いただくのが、 解決への最良の近道だと思います。 スクリーンショットもあれば申し分ありません。
補足
ご回答ありがとうございます。 内容は円柱に画像を貼り付けるというものです。 円柱に凹凸を付けたく、試しにソース内の/****/で囲まれた所で値を変えています。 以前は透けている感じはなかったのですが、改良しているうちに透けているのが分かりました。 同時に変更していない回転の方向や見る角度も変わってしまいました(見下ろしていたのが見上げているように)。 ソース自体長く、複雑になってしまったので、改良したところを中心に載せ、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; }