OpenGLでのオブジェクトの描画上限
OpenGLを使って、オブジェクトを描画する場合の上限はあるのでしょうか。
下記のようにリストを使ってオブジェクトを501個以上描画するとうまく描かれませんでした。
GLUquadricObj *sphere; //オブジェクトポインタを準備
GLint list;
/* 新しいリスト番号を取得 */
list=glGenLists(1);
/* 新しいリストを作成 */
glNewList(list, GL_COMPILE);
/* 球を描画 */
for(i=0;i<600;i++){
//オブジェクトを生成
sphere = gluNewQuadric();
//球を描画 半径1.0,緯経それぞれ20.0分割
gluSphere(sphere, 2.0, 20.0, 20.0);
}
/* リスト作成終了 */
glEndList();
仕様なのかPCのスペックの問題なのかわかりましたらアドバイスお願い致します。
補足
ご回答ありがとうございます。 内容は円柱に画像を貼り付けるというものです。 円柱に凹凸を付けたく、試しにソース内の/****/で囲まれた所で値を変えています。 以前は透けている感じはなかったのですが、改良しているうちに透けているのが分かりました。 同時に変更していない回転の方向や見る角度も変わってしまいました(見下ろしていたのが見上げているように)。 ソース自体長く、複雑になってしまったので、改良したところを中心に載せ、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; }