15

ヘッドレスのGNU/LinuxサーバーでGLUのテッセレーション関数を使用しようとしています。そのためにPyOpenGLを使用したいのですが、問題はgluNewTessの呼び出しでクラッシュすることです(セグメンテーション違反)

gdb backtraceは、それがglGetErrorにあると言っています。これにより、GLUテッセレーションにはGLコンテキストが必要だと思いますか?それとも、PyOpenGLの複雑さだけですか?

ヘッドレス(および仮想化)マシンでGLコンテキストを初期化する方法に関する情報を見つけようとしましたが、運が悪かったです。これらのトピックに関する情報をいただければ幸いです。

4

6 に答える 6

14

最も簡単:

Xvfb :5 -screen 0 800x600x24 &
export DISPLAY=:5
glxgears 

glxgears の代わりに、自分のプログラムに置き換え、'glutInit()' を Python コードに挿入して、基本的な GL ウィンドウを取得します。

もっと強く:

OSMesa ライブラリを使用して GL コンテキストを作成するようにプログラムを書き直してください

最も難しい:

GLU テッセレーターから中身を取り出して、プロジェクトに貼り付けます (MesaLib ソース コードをダウンロードしてください)。

于 2012-01-22T14:10:44.243 に答える
2

VJovic のリンクにあるオプションのほとんどはハードウェア アクセラレーションではなく、OpenGL Framebuffer Object 拡張機能を優先するため、それらはすべて非推奨です (日付: 1997 に注意してください!)。また、Calvin1602 が指摘したように、オフスクリーン レンダリングは完全なソリューションではありません。openGL コンテキストが必要です (ソフトウェア レンダリングを使用する OSMesa を除く)。

私たちの研究所は約 1 年間、ヘッドレス OpenGL レンダリングを行ってきました (関連する serverfault の質問はこちらで参照できます)。最も簡単な方法は、サーバーのローカル X スクリーンへのリモート アクセスをユーザーに与えることであることがわかりました。欠点: (a) x-server へのリモート アクセスを許可することは、間違った方法で行われた場合、悪いセキュリティ プラクティスとみなされます。(b) サーバーのディスプレイにダミー ウィンドウがポップアップ表示されますが、ヘッドレスの場合、これは関係ありません。興味があれば、他のいくつかのオプションも ServerFault リンクに記載されています。

サーバー上で x-screen を実行する必要があります。x-screen を起動するには、一部のビデオ カードに物理モニターを接続する必要があることに注意してください。NVidia ドライバーでは、xorg.conf の ConnectedMonitor オプションを使用してこれを回避できます。. 過去に使用した別のオプションは、ダミーのモニター プラグを作成することです。これにより、システムは CRT モニターが接続されていると認識します。おそらく他の解決策があります。

幸運を!

https://serverfault.com/questions/186805/remote-offscreen-rendering

于 2012-01-13T16:55:43.927 に答える
1

私はしばらくの間、OpenGL コンテキストなしで glu tesselator を使用してきました。これは Windows と Linux (Python ではなく C++) で動作するため、理論的には可能です。gluTessCallback() でエラー コールバックを設定すると、赤い本を参照してください。おそらく glGetError は呼び出されません。

于 2014-02-10T15:16:34.623 に答える
1

オフスクリーン レンダリングを実行できます。詳しくはこちら

グラフィック カードと OS で何がサポートされているかによって異なります。古いグラフィック チップを使用している場合は、mesa OS ライブラリを使用できます (ただし、ソフトウェア レンダリングは利用できます)。新しい場合は、pbuffers を使用できます。

于 2011-06-08T17:31:56.500 に答える
0

GLU は有効な openGL コンテキストを必要とします

窓がない場合は可能ですが、難しいです。opengl wikiを参照してください(3 回読んでください。理解するのは非常に困難です)。

基本的な考え方は、ウィンドウのない特別なコンテキストを作成するには、特別な拡張機能が必要だということです。したがって、この拡張機能を取得するには wglGetExtensionsStringARB を呼び出す必要があります。しかし、それを呼び出すには、最初にコンテキストが必要です! (はい、これは悪夢です。このAPIを作成した人は誰でもいます)。したがって、通常の方法でコンテキストを作成し (画面がなくても機能することを願っています)、拡張機能を取得して wglCreateContextAttribsARB を呼び出します。

注 :拡張機能の仕様には と記載されているWhen this extension is supported, calling wglCreateContext(hdc) is equivalent to calling wglCreateContextAttribs(hdc,0,NULL)ため、単純なコンテキストの作成に賭けることができるかもしれません。

于 2011-06-09T08:06:35.627 に答える