Malevich、Black Squares OpenGLを破りました

Malevichは、OpenGLの開発者に定期的にやって来ます。これは予期せずに大胆に起こります。プロジェクトを開始して、素晴らしいレンダリングの代わりに黒い広場を見るだけです:

今日、私が黒い広場に訪れた理由について説明します。これは、OpenGLが画面に何も描かず、時には窓を透明にするために発見された問題について説明します。

ツールを使用

openglをデバッグすると、2つのツールが私を助けてくれました: renderdoc and and Apitrace 。 RenderDoc– OpenGLレンダリングプロセスをデバッグするためのツール、すべてを表示できます–頂点、シェーダー、テクスチャ、ドライバーからの借金メッセージ。 Apitrace–グラフィックAPIの課題を追跡するためのツールは、ダンプコールを行い、議論を示します。また、WDIFFを介して2つのダンプを比較する絶好の機会もあります(またはそれほど便利ではありません)

あなたが働いている人とチェック

古い依存関係SDL2、GLM、ASSIMP、GLEWを備えたオペレーティングシステムUbuntu 16.10があります。 Ubuntu 18.04の最新バージョンでは、ゲームのアセンブリを取得します death-mask 16.10でChrootとアセンブリを使用する場合、グラフィックスを使用してゲームの作業アセンブリを取得します。

Ubuntu 18.04

で何かが壊れたようです

ldd は、Linkkaを同一ライブラリSDL2、GLに示しました。 Renderdocで非公式のビルドを運転して、頂点シェーダーの入り口でゴミが見られましたが、よりしっかりした確認が必要でした。二ナリック間の違いを理解するために、私はそれらを apitrace を通して両方を運転しました。ダンプの比較により、新鮮なUbuntaのアセンブリがOpenGLの見込み客のプログラムを破り、実際にゴミをそこに送信することがわかりました:

マトリックスはGLMライブラリに集まります。 16.04&#8211からGLMをコピーした後;私は再びゲームのワーキングビルドを手に入れました。問題は、GLM 9.9.0の単一マトリックスの初期化の違いであり、コンストラクターのMAT4(1.0F)の引数を明確に示す必要があります。初期化とライブラリの著者である 「Noopener」> FSGL のテスト。 FSGLで欠陥を見つけた執筆の過程で、それらについてさらに説明します。

誰が人生にいるのかを決定します

OpenGLを使用した正しい作業では、 自発的に強制的に 特定のバージョンのコンテキストを要求する必要があります。したがって、SDL2を探します(コンテキストを初期化する前に、バージョンを厳密に配置する必要があります):

<! - hilite.me->

を使用して生成されたHTML

“>

 sdl_gl_seettrtribute(sdl_gl_context_major_version、 3 );
sdl_gl_settribute(sdl_gl_context_minor_version、 2 );
sdl_gl_settribute(sdl_gl_context_profile_mask、sdl_gl_context_profile_core);

たとえば、RenderDocは3.2未満のコンテキストでは動作しません。コンテキストを切り替えた後、同じ黒い画面を見る可能性が高い。なぜ?
OpenGL 3.2のコンテキストは、VAOバッファーの存在を必要とする必要があるため、グラフィックドライバーの99%が機能しません。簡単に追加:
<! - hilite.me->

を使用して生成されたHTML

">

 glgenvertexarrays( 1  vao);
glbindvertexaray(VAO);

眠らないでください、凍結

私はクブントゥで興味深い問題にも会いました。黒い正方形の代わりに透明に見えることがあり、時々すべてが正しくレンダリングされました。スタックオーバーフローでこの問題の解決策を見つけました:
https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes

FSGLテストレンダリングコードも存在していました睡眠(2s);そのため、XubuntuとUbuntuで正しいレンダリングを受け取り、アプリケーションを睡眠に送りましたが、Kubuntuでは、イルカの発売の80%と発射とターミナルの30%で透明なスクリーンを受け取りました。この問題を解決するために、ドキュメントで推奨されているように、Slevent調査の後、各フレームにレンダリングを追加しました。

テストコード:
https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/

ドライバーに話しかけます

OpenGLは、アプリケーションとドライバーの間の通信チャネルをサポートし、それをアクティブにするには、GL_DEBUG_OUTPUT、GL_DEBUG_OUTPUT_SYNCHRONUSをオンにする必要があります。
ここで初期化の例を撮ることができます:
https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp

Leave a Comment

Your email address will not be published. Required fields are marked *