OpenGLでオブジェクトの描画上限はあるのか?

このQ&Aのポイント
  • OpenGLを使用してオブジェクトを描画する場合、描画上限の制限はありますか?
  • リストを使用して501個以上のオブジェクトを描画しようとすると、うまく描画されません。
  • 問題は仕様なのか、PCのスペックの問題なのか、アドバイスをお願いします。
回答を見る
  • ベストアンサー

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のスペックの問題なのかわかりましたらアドバイスお願い致します。

noname#213520
noname#213520

質問者が選んだベストアンサー

  • ベストアンサー
  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.1

基本的には環境依存で、GRAMの大きさに依存します。 ディスプレイリストの生成に失敗した場合、glEndList()実行後、glGetError()でGL_OUT_OF_MEMORYが帰ってくるので、成功、失敗はそれで判断できます。

関連するQ&A

  • openGLにおいて描画した物体によってできる影

    OpenGLで3次元オブジェクトを描画する際, 光源の位置によって物体の明るい場所と暗い場所を 表現する方法は知っています.(glShadeModel(GL_SMOOTH);など) しかし,このような方法ではオブジェクトにできる影は光源と オブジェクトの形状のみに依存し, その他のオブジェクトに影響されません. そこで,添付した画像のように, 「複数の3次元オブジェクトを描画した際に, 一方のオブジェクトがもう一方のオブジェクトによって影ができる」 という風に描画するにはどうすればよいですか? ご存知の方がいましたら,どうか教えていただけないでしょうか. よろしくお願いします.

  • OpenGLで写真を表示したい

    OpenGLで書いた四角の中に写真を表示したいのですが、どうやって良いのか良くわかりません。 具体的には、 glNewList(i*2,GL_COMPILE); glBegin(GL_LINE_LOOP); glColor3fv(col[i]); glVertex2i(xpos[i]-radiusx[i],ypos[i]-radiusy[i]); glVertex2i(xpos[i]+radiusx[i],ypos[i]-radiusy[i]); glVertex2i(xpos[i]+radiusx[i],ypos[i]+radiusy[i]); glVertex2i(xpos[i]-radiusx[i],ypos[i]+radiusy[i]); glEnd(); glEndList(); で描画した四角形の中に radiusx[i]*2 , radiusy[i]*2 の大きさに縮小した i番目のJpeg写真(640x480)を書きたいのです。 現在、以下のファイルをインクルードしています。 #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <stdio.h> 追加すべきインクルードファイル、DLLなどお教えください。 なお、開発環境はフリーの Visual Windows for BC++ です。

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

  • 【C++でOpenGL】平面から立体を作るには

    こんにちは。最近大学の研究にOpenGLを利用しようと思っている者です。 今,2次元座標上に平面図形を描画し,それを底面をその形のまま 3次元座標上に立体として起こす,という点で悩んでいます。 現在は,3次元座標上のx,y平面にGL_POLYGONで多角形を描画し, for文でz軸方向に繰り返し描画するよう設定していて, 擬似的に立体っぽくしてはいるのですが, 真横からみるとやはり平面と平面の隙間が目立って上手くいきません。 繰り返し回数を増やし,1回のz座標の増加量を小さくすると, 隙間はあまり目立たなくなるのですが,やはり実行時間が大幅にかかってしまいます。 OpenGLで底面が多角形の3Dオブジェクトを描画する方法を ご存知の方がいらっしゃいましたら,ぜひご指導お願い致します。 また,「こうした方がもっと効率良いのでは?」という意見もございましたら, ぜひお願い致します! 殆ど初心者ですので,受け答えなどに至らない点がございましたらすみません。

  • opengl

    C++,openGLの質問です. 画像の上で2点を指定し,その2点を用いて画像上に四角形を表示したいのですがどういったpログラムを書けばいいでしょうか?イメージは図のような感じです.(1)と(2)が画像上で指定した点で高さが255の長方形になるようにしたいです. http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#5 のサイトを参考に作ってみたのですが,いまいちわかりません. 以下,自分で作ってみたところです. わかりにくいと思いますが,アドバイスいただけたら嬉しいです. painted_pointはint型のベクターでクリックされた点の位置を保存しています. 最終的には,3点以上の折れ線上に長方形がつながってくっつくのことを予定しています. for(int i = 0; i<painted_point.size(); i++){ GLdouble vertex[][3] = { { painted_point.at(i).x, painted_point.at(i)., 0 }, { painted_point.at(i).x, painted_point.at(i)., 255 } } }; int edge[][2] = { {1 , 2} for(int i=0; i<painted_point.size(); i++){ edge[][2] ={{ i*2 , i*2 + 2}, { i*2+1 , i*2 + 3}, } {painted_point.size()-1,painted_point.size()} }; /* 図形の描画 */ glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); for (i = 0; i < 12; ++i) { glVertex3dv(vertex[edge[i][0]]); glVertex3dv(vertex[edge[i][1]]); } glEnd(); }

  • OpenGLで登録したコールバック関数の引数

    OpenGLで画面を描画をする際に, 以下のソースのように,glutDisplayFuncに関数を登録しています. main関数で,定義した定数や,そのポインタを display_funcに渡したいと思うのですが, どのような方法があるのでしょうか? 現在,私は,グローバル変数を定義して,それをmain関数とdisplay関数で いじっています. ソースコードの整理,関数化のため,できれば,ポインタや引数を渡したいです. どうぞよろしくお願いします. --------------------------------------------- #include <GL/glut.h> void display_func(void) { 描画内容を記述 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display_func); glutMainLoop(); return 0; } ---------------------------------------------

  • Word: mac 2011 オブジェクトの選択

    Word: mac 2011でテキストの背面にあるオブジェクトを選択するにはどうしたらいいのでしょうか?  2004では「図形描画ツール」を表示すると図形選択用のポインタに変更でき、そのポインタをオブジェクトの上に持って行けば、オブジェクトがテキストの背面にあっても選択できました。 2011ではそうしたポインタがないようです。「.doc」の文書を2011で編集しているのですが、テキスト背面にあるオブジェクトがどうしても選択できずに困っています。ヘルプを開くと、「表示」「デザインレイアウト」でオブジェクトを選択しろ、などというような内容が出てきますが、「デザインレイアウト」を選ぶと「デザインレイアウト表示で新しい文書を作成しますか?」と表示されて、何の事か分かりません。 簡単にテキスト背面のオブジェクトを選択できる方法がありましたら、教えていただけると助かります。 よろしく御願い申し上げます。

  • プログラミングのopenglで困っています.

    OpenGlの超初心者です. openglで,円を一つ作ってあるsampleプログラムを拾ってきたのですが, 円をもう一つ,別の座標で作りたいのですが,以下のプログラムをどのように編集すればいいですか? 誰か助けてください. ========================================== #include <GLUT/glut.h> #include "glut.h" #include <math.h> //--初期化処理------------------------------------------------------------------ void myinit(void){ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);//背景色の設定(R,G,B,ALPHA) 0.0-1.0の範囲で } //--描画内容-------------------------------------------------------------------- void display(void){ float x1,y1,x2,y2; float th1,th2; float th1_rad, th2_rad; float hankei = 0.1; glClear(GL_COLOR_BUFFER_BIT);//画面全体を背景色で塗りつぶす glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //単位行列を行列スタックに読み込む glColor3f(0.0f, 0.0f, 0.0f);//頂点カラーの指定( R, G, B すべてが1.0fなら白) for (th1 = 0.0; th1 <= 360.0; th1 = th1 + 10.0){ th2 = th1 + 10.0; th1_rad = th1 / 180.0 * 3.1415926; // 「度」を「ラジアン」に直す th2_rad = th2 / 180.0 * 3.1415926; x1 = hankei * cos(th1_rad); y1 = hankei * sin(th1_rad); x2 = hankei * cos(th2_rad); y2 = hankei * sin(th2_rad); glBegin(GL_LINES);//glBegin(GL_LINES)とglEnd()の間に glVertex2f( x1, y1 ); //描画したい直線の頂点を並べる glVertex2f( x2, y2 ); glEnd(); //ここまでで,ひとつのオブジェクトの宣言がおわる } glFlush();//OpenGLで実際に描画を行う } //--再描画---------------------------------------------------------------------- void myReshape(GLsizei w, GLsizei h){ glViewport(0,0,w,h); //ウィンドウ全体をビューポートにする glMatrixMode(GL_PROJECTION); glLoadIdentity();//単位行列を行列スタックに読み込む glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); } //--メイン関数------------------------------------------------------------------ int main(int argc, char **argv){ glutInitWindowPosition(100, 100); //(図形が描画される)ウィンドウ位置の設定 glutInitWindowSize(600, 600); //(図形が描画される)ウィンドウサイズの設定 glutInit(&argc, argv);//環境の初期化 glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE); //表示モードの設定 glutCreateWindow("kadai"); //ウィンドウを開く glutDisplayFunc(display); //図形表示関数の指定 myinit(); glutReshapeFunc(myReshape); //座標軸・ビューポート設定関数の指定 glutMainLoop();//無限ループ return 0; } ==========================================

  • OpenGL テクスチャを縮小表示すると縞模様が…

    こんにちは。お知恵をお借りしたく質問致します。 OpenGLのglTexImage2D関数でテクスチャを作り、Windowsフォームアプリケーション上に表示する際に起きた問題です。 なお、GLSLフラグメントシェーダでテクスチャは編集されています。 そのシェーダを利用した結果を表示すると、dot by dotで表示した際は正常に表示されるのですが、縮小して表示するとモアレと言いますか、縞模様が出てしまいます。※画像参照 また、縮小と言いますのはWindowsFormアプリ内のOpenGL描画用コントロール(glControl)そのものをリサイズするという意味で、テクスチャを作成する際に何か縮小操作を行ったというわけではありません。 テクスチャの貼付は以下のように行っています。 GL.Viewport(0, 0, glControl.Width, glControl.Height); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.Texture2D); GL.Begin(BeginMode.Quads); { GL.TexCoord2(0, 0); GL.Vertex2(-1, 1); GL.TexCoord2(1, 0); GL.Vertex2(1, 1); GL.TexCoord2(1, 1); GL.Vertex2(1, -1); GL.TexCoord2(0, 1); GL.Vertex2(-1, -1); } GL.End(); GL.Disable(EnableCap.Texture2D); glControl.SwapBuffers(); テクスチャ(1920x1080、RGBA)自体の作成が(理由は不明ですが)縮小時のみおかしくなっている、又はテクスチャの貼り方やビューポート周りの設定不足のように思って居るのですが、原因が掴めていない状況です。 参考までに、補間方法を変えた際の違いも一応スクリーンショットに撮りましたのでよろしければご覧ください。 たった今、glGetTexImageという関数で、作成したテクスチャを取得できるらしいということが分かり、これを用いて縮小表示している際もテクスチャそのものが正常に作成されているかどうかを確認しようと思っています。(が、環境が手元に無く、この確認は明日の朝となります。) この原因及び対処法など、解決の手助けとなるようなことがありましたら何でも構いませんので教えていただきたいです。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • OpenGL 画像のα値操作

    こんにちは。 現在、授業の一環でGLUTを用いたOpenGLのプログラムを作っています。 そのプログラムの機能の中に、読み込んだ画像のα値を記憶した後、キー操作によって表示・非表示を切り替える機能を作ろうとしています。 目的の機能自体は一応途中まで(各ピクセルのα値を255⇔0への切り替え)は作れたのですが、原理がよく分かりません。 具体的に書くと、(幅)×(高さ)×(色のチャンネル数) の画像を読み込んだのに、4倍の高さの範囲までα値に関する処理を加えないと、処理後の効果が画像全体に現れないのです。 下にプログラムの断片を張るので、わかる方がいたら解説お願いします。 出来れば、後々のために理由を知っておきたいので。 -*-*-*-*-*-*-*-*-*- /* テクスチャの情報を格納する構造体 */ typedef struct{ unsigned int name; /* 識別番号 */ unsigned char* data; /* 画像のデータ */ int width; /* 画像の幅 */ int height; /* 画像の高さ */ int channels; /* 画像の色成分の数 */ }texture; /* テクスチャ(グローバル変数) */ texture a; /* 画面表示用の関数 */ void display (void) {  /* 初期化 */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 透明色を描けるようにする */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  /* 描画 */ glDrawPixels(a.width, a.height, GL_RGBA, GL_UNSIGNED_BYTE, a.data); glutSwapBuffers (); } /* α値の操作(代入値がかわるだけなので、255にする方は省略) */ void alpham(void) { int i, j; for (i = 0; i < a.height * 4; ++i) { for (j = 0; j < (a.width); ++j) { a.data[(a.width * i) + (a.channels * j) +3] = 0; } } } ※画像データ の メモリ確保サイズ a.data = (unsigned char*) malloc(width * height * channels)

専門家に質問してみよう