• 締切済み

openglをVC++2010で利用したいです。

VisualC++2010でopenglのプログラムを利用しているものです。 openglのインストールを完了し、プログラムにエラーもなくコンパイル、実行したのですが、図形が描画されるところが真っ黒のまま何も表示されません。 視点の問題かと思い、gluPerspectiveをいじったりしても何も表示されず、 プログラムのミスかと思いネット上のプログラムをコピペしても何も表示されません。 原因をいろいろネットで調べたのですが、なかなか解決に至りません。 使ってるPCはdynabookR542/16FS PR54216FNTS osはWindows7の64bitです。 よろしくお願いします。

みんなの回答

回答No.3

自分(OpenGL超初心者)も同じ症状になりました。 以下のように2か所を変更してみて改善されませんでしょうか。 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA ); →glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA ); display関数の最後に glutSwapBuffers(); を挿入 なぜシングルバッファでうまくゆかないのかは分からないのですが。

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

念のための確認ですが、真っ黒というのはコンソールではないでしょうか。 No.1の補足に補足いただいたソースをVisualStudioで実行したところ、私の環境では ウィンドウが2つ表示され、1枚が黒(コンソール)もう1枚が赤(OpenGLのウィンドウ)で表示されます。 ちなみに、draw_triangleは、これでは視線と平行な三角形になり表示されません。 void draw_triangle(void) { glBegin(GL_TRIANGLES); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.0, -1.0, 0.0); glVertex3f(-1.0, 0.0, 0.0); glEnd(); } ではないでしょうか。

tobanaibuta
質問者

補足

返信遅くなりました。 回答ありがとうございます。 僕の場合も、ウィンドウが2つ表示されますが、2つとも画面内は真っ黒のままです。 draw関数の中身を変更しても特に変化が見られませんでした。 やはりなんらかの設定に問題があるのでしょうか?

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

ちょっとこの質問では情報が少なすぎます。 > ネット上のプログラムをコピペしても何も表示されません。 これはURL等は出せないでしょうか。 たとえば、基本的なチェック方法として、 ・glClearColorで背景色を変えてみる ・形状の描画を一度全て無効化する これで画面の色が変わればOpenGLはちゃんと動いています。 そうでなければ、何らかの事情でOpenGLが動いていません。 色が変わるようであれば、まさに書かれているとおり、 gluPerspectiveが正しくないなどのプログラムのミスがあります。 glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)view_width/(double)view_height, 0.01 , 5 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( 0.0 , 0.0 , 3.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ); glColor3d(1,0,0); glutSolidTeapot(0.3); glutSwapBuffers(); たとえば、これをそのまま描画関数にした場合にティーポットが表示されないでしょうか。

tobanaibuta
質問者

補足

回答していただきありがとうございます。 まず、参考にしたプログラムですが、大学の講義で使用した三角形を表示する単純なプログラムです。 #include<windows.h> #include<GL/gl.h> #include<GL/glut.h> // // sample1-2.cpp // void init_gl_settings(void); void display(void); void draw_triangle(void); void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA ); glutInitWindowSize(250, 250); glutInitWindowPosition(200, 200); glutCreateWindow("cube1.c"); init_gl_settings(); glutDisplayFunc(display); glutMainLoop(); } void init_gl_settings(void) { glClearColor(1.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, 1.0, 2.0, 200.0); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -6.0); glRotatef(0.0, 1.0, 0.0, 0.0); draw_triangle(); glFlush(); } void draw_triangle(void) { glBegin(GL_TRIANGLES); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, -1.0); glVertex3f(-1.0, 0.0, 0.0); glEnd(); } 回答にあったように、glClearColorをいじってみたところ色に変化が見られませんでした。 また、いただいたプログラムを入力してみたのですが、やはり真っ黒のまま何も表示されていませんでした。 やはりopenglが動いていないということなのでしょうか? となるとどのような対策が必要になってくるのでしょうか?

関連するQ&A

  • VC++でperlプログラムを動かすには

    VC++でOpenGLを動かしているんですが, その途中でperlのプログラムを動かしたい場合,どうしたらよいのでしょうか? 詳しい動きとしては, 1.perlのプログラムを動かして,txtデータを出力する 2. その出力したtxtをOpenGLの中で読み込んで,描画を表示 3.再びperlのプログラムを動かして,新しいtxtデータを出力する 4. その出力したtxtをOpenGLの中で読み込んで,描画を表示 この繰り返しです. この一連の動作をVC++でいっぺんに行いたいのですが, 可能でしょうか? 何かもっと詳細が知りたい場合は,なんでも聞いてください! よろしくお願いします.

  • VisualC#2005の質問

    VisualC#でとあるプログラムを作っていて Windowsフォームへの図形描画のプログラムを組んでいるのですが 図形描画のプログラムについて詳しく解説しているサイトは ないでしょうか?

  • X Window上でのOpenGLの使用

    お世話になっております. C++で書いたOpenGLを用いたプログラムをlinux上で演算させ, x WindowでWindowsのPC上に3次元描画をするために, 現在,試行錯誤をしております. (3次元描画と格好いい文言ですが,所詮,点列や辺の描画なんですが・・・) そのプログラムの実行過程で, 描画関数において,エラーが出ていて,それに関する質問です. 現在の状況として, プログラムのコンパイルは出来ております.一応,コンパイラはicpcを使ってます. で,実行エラーとして, freeglut (./a.out): OpenGL GLX extension not supported by display '***.***.***.***:0.0' と出ております. このエラーは,glCreatWindow()という関数でエラーが返されており, X Windowを用いて表示するためには,他のライブラリが必要であると考えました. そこで,調査したところ, XGLというライブラリの存在を知りました. 私の理解では, XGLとは,X WindowでOpenGLを使用するためのドライバー的なライブラリだと理解しております. そこで,使い方を調査しているのですが, ネット検索の段階で,全く掲載ページがない, (書籍の調査は明日以降かなと・・・) ということで,ここに質問させていただきました. 具体的なプログラミングの仕方,参考Webページ,書籍等 や, そもそも,XGLなんて間違っていて,他に使用すべきライブラリがある, とか... 出来れば,C++で書いた現在のプログラムに, 少しだけの変更で収められるようなモノが良いな...と欲張りなことも思っています... ご存じであれば,教えていただきたく,お願い申し上げます. ソースコードは... 数千行のプログラムなので,ちょっと勘弁願いたく...

  • OpenGLでの連続画像の保存

    OpenGLを使用し、描画した図形がパラパラ漫画のようにアニメーションし、アニメーションするたびに一枚ずつ出力するというプログラムを作成しているのですが、連続で出力すると同じ画像ばかりが出力されてしまいます。 glReadPixel();でバッファを取得し変数に格納した画面表示の情報が更新されていないのが原因と見ていますが、修正の方法がわかりません。知ってる方がいらっしゃったらよろしくお願いします。 Visual stadio2010を使用し、UIにMFCアプリケーションを使用しています。

  • OpenGLでの描画のタイミング

     OpenGLの使い方について疑問があったので質問しました.  OpenGLを用いて3Dのゲームを作っています.しかし, どうも処理が遅くカクカクした動きになってしまいます. 描画の量が多くなるにつれて遅くなっているので,原因は 描画の時に原因があるようです.ダブルバッファリング を用いて描画しているのですが,描画のときは… 1「描画関数の実行」(glVertex3f()などの実行) 2「裏に描画」(見えていないバッファに描画) 3「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」            (60FPSなら1/60秒程度) を繰り返すものと考えています.  「1230」と繰り返せば通常通り動くのですが, 「1」に計算がかかりすぎると,「2」と「3」が遅れてしまい, カクカクしてしまうのだろうと考えました. (↑これがそもそも間違っていたらすいません><)  そこで,対策を2つ考えたのですが,これでいいでしょうか? それとも,もっと良い方法はないでしょうか?(「1」を 速くするしか方法はないでしょうか?) 【1】一定時間待機する秒数を可変的にする  現在のところ,「0」では,1/60秒待機させています.  しかし,1に1/30秒かかったとすると,「1230」を 1回繰り返すのに,3/60秒かかってしまうことになり, 結局FPSは20止まりです.  そこで,「123」でかかった時間を記録し,その秒数 を1/60から引いた分だけ「0」で待機すれば,1/60秒になる だろう,という方法です. 【2】描画のタイミングを変える  現在のところ,「1230」の順番で繰り返しています. しかし,これでは描画の関数を呼び出した時,「1」に 1/30秒かかったとすると,実際に表示できるのは1/30秒後 ということになります.よって,プログラムの始めに 「1232」を実行しておき,描画の関数の中身は 「3120」とする,という方法です. (そもそも,「2」と「3」のタイミングを   離せるのかどうかもよくわかりません><)  もちろん【1】と【2】の方法は併用もできると思っています. 「2」はOpenGLに入っているglFlush() 「3」はOpenGLに入っているglutSwapBuffers() 「0」はOpenGLに入っているglutTimerFunc() を用いています. 質問が長くなってしまいましたが,よろしくお願いします. 参考までに… 【OS】Mac OS10.7(Lion) 【開発環境】Xcode3 【言語】c++ 【プログラミング歴】6年(c++2年,OpenGL1年) 【CPU】2.66 GHz Intel Core 2 Duo 【メモリ】4 GB 1067 MHz DDR3

  • openGLにおける複雑な図形のモデリング

    稚拙な質問だと思うのですが、ご教授下さい。 OpenGLを勉強中で立方体の表示とかはできるようになったのですが、いざ複雑な図形となると何をどうすべきなのかがさっぱりわかりません。 DirectXの解説ページには、モデリングのツールで作成したファイルを読み込んでプログラムから表示することができるようなことが書いてあるのですが、openGLに関してこのようなページを見つけることができませんでした。 OpenGLで人などをモデリングして表示する際は、こつこつと頂点やら面やらを吐くコードを書きながら調整して行くのが主流なんでしょうか? ・・・そんなわけはないと思うので、既存のツールやそのツールで作ったものをプログラムから利用する手順に関する資料のあるページへのポインタだけでも教えて下さると幸いです。

  • プログラミングの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の勉強をしながらプログラムを組んでます。 図形を描画して拡大縮小まではできました。 static Skx, Sky, Skz, gluLookAt(Skx, Sky, Skz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); #--- キーボード操作による関数(Skx,Sky,Skzの操作) #--- これで拡大縮小はできるようになったのですが、ある一定のところまで縮小すると背景に埋め込まれるような感じで目線より遠い部分から隠れていくような感じになってしまいます。 (拡大すると隠れた部分は戻ってきます) なぜこのようなことが起こるのでしょうか。 お分かりの方がいらっしゃいましたら教えて頂ければ幸いです。 また、回避方法もご教示頂けたらと思います。

  • OpenGLがコンパイルできません。

    OpenGLをコンパイルしようとしてCygwinで 「gcc -o sample (プログラムの名前).c -I/usr/local/include -lglut32 -lglu32 -lopengl32」 と入力すると 「In file included from /usr/include/GL/glut.h:132, from (プログラムの名前).c:1: /usr/include/w32api/GL/glu.h:230: error ハクヒ。・ィ・鬘シ before '*' taken」 と表示されてコンパイルできません。「ハクヒ。・ィ・鬘シ」の部分は文字化けだと思います。このエラーメッセージから何が問題か分かる方がいらっしゃいましたら回答していただけると嬉しいです。CygwinはNetinstallからすべてのものをインストールしたので足りないものはないと思います。よろしくお願いします。

  • VisualC++で図形描画スクリプトを組みたい

    VisualC++2008でテキストなどから 数字・文字を読み込んで図形化するスクリプトを組みたいです たとえば  10-10-G-100 とかかれたときに 左から"-"を区切りとしてX始点座標-Y始点座標-色-長さ という風に解釈して図形を描画する 例の場合なら X10・Y10を始点にして緑色の右に長さ100ドットの決められた図形を描画する こんな感じでルール化された図形描画スクリプトを 組みたいと考えているのですが 図形描画の方法がわからず プログラムが組めずに困っています どなたか教えていただけないでしょうか?

専門家に質問してみよう