質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

1回答

5798閲覧

OpenGL(PyOpenGL)でポリゴンが描画されない

fennec

総合スコア19

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

0クリップ

投稿2017/06/03 13:24

###前提・実現したいこと
OpenGL(PyOpenGL)でglVertexAttribPointerを使った方法でモデルを描画したいです。

http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090827
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090828
こちらのサイトを参考にPMDファイルを読み込んでモデルを描画するプログラムを実装しました。

###発生している問題・エラーメッセージ
シェーダーのコンパイルは出来ていますが、実行すると背景以外何も表示されません。
エラーも出てないです。

###該当のソースコード
こちらです
https://github.com/Syno1875/PMDViewerWithPyOpenGL/blob/branch/pyopengl3.py

ほぼ上で提示したサイトのコードと同じで、glMapBufferを使っていなかったり一部変更していますが、
やり方自体は同じはずなので、なぜ描画されないのか今一分かりません。
調べたところ、うまく配列を渡せていないとこのようになるらしいのですが、コードを見直しても
ミス等は見つけられませんでした。

OpenGLに詳しい方、ご教授願います。

###補足情報(言語/FW/ツール等のバージョンなど)
OSはUbuntu 16.04、
Pythonのバージョンは3.5.2 使用ライブラリはPyOpenGL、Numpyです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OpenGLはバージョンによって可能な操作に微妙な差があったりしますので、現在実行中のOpenGLコンテキストのバージョンや、どのようなエクステンションが備わっているかに注意する必要があります。
バージョンやエクステンションはglGetStringで調べることができます(エクステンションはバージョン3.0以降はglGetStringiで取得する仕様になりましたので、うまくいかない場合こちらもお試しください)。

また、OpenGLはプログラマ側からエラーを問い合わせない限り、何も報告せずに描画してくれないというようなことがしばしばありますので(パフォーマンス上の理由からのようです)、glGetErrorでエラーの有無を調べ、戻ってきたGLenum(もし最後にglGetErrorを実行してから後に何らかのエラーが起こっていた場合、GL_NO_ERROR以外の値になります)を、gluErrorStringなどに渡して詳しいエラーメッセージを得る...といった面倒な手順が必要になるかと思います。
こういったデバッグに有用な定型作業は関数としてひとまとめにして、適宜疑わしい部分でチェックするといいでしょう。

OpenGLのバージョンとエクステンションの一覧が分かれば、もう少し詳しく回答を申し上げられるかもしれません。

[追記]
クラス AppBase の実装 — 読書ノート v1.4.0devに例示されているコードにバージョンを確認する部分が含まれていました。ご参考になりますでしょうか。こちらのサイト、他のページにも色々情報が載っており、なかなか役立ちそうです。

def init_glut(self, args): """Initialize the GLUT state.""" # Initialize GLUT. GLUT.glutInit(args) GLUT.glutInitContextVersion( self.context_version[0], self.context_version[1]) GLUT.glutInitContextFlags(GLUT.GLUT_FORWARD_COMPATIBLE) GLUT.glutInitContextProfile(GLUT.GLUT_CORE_PROFILE) GLUT.glutSetOption( GLUT.GLUT_ACTION_ON_WINDOW_CLOSE, GLUT.GLUT_ACTION_GLUTMAINLOOP_RETURNS) # Initialize and create the main window. GLUT.glutInitDisplayMode( GLUT.GLUT_DOUBLE | GLUT.GLUT_RGBA | GLUT.GLUT_DEPTH) GLUT.glutInitWindowSize( self.window_size[0], self.window_size[1]) GLUT.glutInitWindowPosition( self.window_position[0], self.window_position[1]) GLUT.glutCreateWindow(self.window_title) GLUT.glutDisplayFunc(self.render) GLUT.glutIdleFunc(self.idle) GLUT.glutReshapeFunc(self.resize) GLUT.glutKeyboardFunc(self.keyboard) GLUT.glutTimerFunc(0, self.timer, 0) GLUT.glutMouseFunc(self.mouse) GLUT.glutMotionFunc(self.motion) GLUT.glutCloseFunc(self.cleanup) aspects = [('Vendor', GL.GL_VENDOR), ('Renderer', GL.GL_RENDERER), ('Version', GL.GL_VERSION),] if self.context_version[0] > 1: aspects.append(('GLSL', GL.GL_SHADING_LANGUAGE_VERSION)) for i in aspects: print('{}: {}'.format(i[0], GL.glGetString(i[1]).decode()), file=sys.stderr, flush=True)

投稿2017/06/03 14:47

編集2017/06/03 20:55
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fennec

2017/06/04 09:18

回答ありがとうございます。返信遅くなってすみません。 紹介して下さったコードを参考にバージョンとエクステンションを出力させてみたところ、この様になりました。 https://github.com/Syno1875/PMDViewerWithPyOpenGL/blob/branch/log.txt また、glGetErrorとgluErrorStringを使ってみたのですが、no errorとなり、エラーは出力されませんでした。 自分でもまた詳しく調べてみますが、この場合は、 処理は正常に実行されているが、シェーダー・頂点配列等の不備によって実際に見えるように描画されていない ということなのでしょうか。 それとも、エラー自体が正しく取得できていないのでしょうか。 OpenGL勉強中なので、自分自身よく理解できていない部分もありますが、何卒よろしくお願いします。
Bongo

2017/06/04 10:07

エラー箇所特定の方針ですが、怪しいOpenGL関数の前後をエラー表示関数で囲んでみてください。例えば <ここと> glDrawArrays(GL_TRIANGLES, 0, md.face_vert_count) <ここでエラー確認> 関数実行前にエラー確認してそれまでのエラーを消し(これはglGetErrorのみでもいいかもしれません)、関数実行後にエラーが表示されれば、その関数が正常に実行されなかったことが分かります。 もう一つ、エラーが出ないのに正常に描画されない場合、正しくデータが受け渡されていない可能性もあります。さしあたりの確認事項として、 ・Init内の「glClearColor(0.0, 0.0, 0.0, 1.0)」に何か適当な色を入れてみて、その通りの色で塗りつぶされるか...これがダメならOpenGLの環境セットアップの時点でまずい部分があるかもしれません。 ・GLSL内の「gl_Position = vec4(position, 1.0);」を「gl_Position = vec4(position / 1000.0, 1.0);」などと適当に縮小してみて、何かしら変なものが画面に現れるか...1000.0を色々変えてみて何か出てくるようなら、描画自体は正しく行われているものの、座標変換が狂っている可能性が高いです(シェーダーを使う場合、従来の行列系関数ではなく、必要な行列をシェーダーに投入して、GLSLで座標変換するのが普通です)。もしこのケースなら、エラーに関してはひとまず問題ないでしょう。 これらは比較的簡単に確認できるかと思いますので、個々のOpenGL関数のエラー確認の前にこのあたりを見ておく方がいいかもしれません。
fennec

2017/06/04 12:51

返信ありがとうございます。解決しました。 gl* の関数をすべてエラー表示関数で囲んで確認したところ、全てno errorでした。 また、glClearColorの色を変えてみたところ、きちんと反映されました。 そして、positionを1000から0.01まで割ってみたところ、変化なしでした。 なので、Attrib関係の関数を調べていったところ、glVertexAttribPointerの第6引数をNoneにしているコードを発見しまして、これを試してみたところ無事モデルが表示されました。 このことについて調べたら、下のサイトを発見しまして、 https://twistedpairdevelopment.wordpress.com/tag/pyopengl/ Noneではなくctypes.c_void_p(0)に変えてみたところ、こちらも問題なく表示されました。 一つ一つ原因を潰していったことで解決出来たのだと思います。本当に感謝です。 また何かありましたらよろしくお願いします。
Bongo

2017/06/04 21:03

おお、そういう事情もありましたか。こういった使う言語やライブラリの違いによる微妙な変化もやっかいですね...ともあれ表示されましたようで安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問