Skip to content
Go back

OpenGLトラブルシューティング

· Updated:

全般

表示がおかしい

  • 行列が転置状態になっているかも
    • ベクトルを右から掛けてみる
    • DXCの-Zprオプションを使って、ベクトルを左から掛けてみる
      • オプションなしだと、GLSLではlayout(row_major)が付与されます

コンピュートシェーダ

テクスチャをサンプリングできない

描画

深度テストと深度書き込みを有効にすると、オブジェクトが描画されない

  • フレームごとに深度バッファをクリアしてみる
    • 深度バッファがクリアされないと、最も小さい深度値が蓄積してしまい、シーン全体が深度テストに失敗するようになります
    • 深度バッファを正しくクリアするにはglDepthMaskGL_TRUEにするのを忘れないこと

ディスパッチ

コンピュートシェーダが動作しない

  • glDispatchComputeに0ではなく、1を渡してみる
    • いずれかが0だとグループの総数が0になって、結果としてシェーダが動作しません

フレームバッファ

glClearでフレームバッファを初期化できない

  • gl(ColorMaskglDepthMaskGL_TRUEにしてみる
    • glClearも書き込みマスクの影響を受けます

バインドしても書き込み先が変化しない

バッファ

glBindBufferRangeでバインドしたバッファがシェーダから見えない

  • 構造体のサイズを大きめの2の倍数(256や512)になるよう調整してみる
    • glBindBufferRangeoffsetは、GL_*_BUFFER_OFFSET_ALIGNMENTの値の倍数でなければなりません ― OpenGL Wiki

頂点バッファやインデックスバッファに対する操作が正常に行われない

  • 頂点バッファやインデックスバッファを操作するときにVAOをバインドしてみる
    • CoreプロファイルではVAOが必須です ― Modern OpenGL
    • Compatibilityプロファイルでは0番のVAOがデフォルトで用意されるので、VAOを明示しなくても動作します

バインディング

前回起動時のバインディング番号が反映されてしまう

  • バインドするすべてのリソースが、シェーダの要求するサイズを満たしているかを確認してみる
    • この不具合に遭遇したときは、不具合が出た箇所より前にバインドされていてシェーダの要求サイズより小さかったUBOに対して、そのサイズを大きくすると解消されました
    • ドライバのキャッシュ機構が悪さしたのかも?

DXC

dxc failed : error code 0x80070459.

  • ソースファイルをBOMありUTF8に変換してみる
    • 2019/02/27現在、BOMなしUTF8だと日本語を含む場合にエラーになります

インクルードするファイルが見つからない

  • -Iオプションを使う
  • Windowsであれば、パスの区切り文字をバックスラッシュで置き換えてみる
    • 2019/02/27現在、Windowsではパスの区切り文字としてスラッシュを受け付けてくれません

spirv-cross

テクスチャにbindingが付与されない

  • --combined-samplers-inherit-bindingsオプションを使ってみる

構造体で構造体の変数を宣言するとコンパイルエラーになる

  • 2019/03/08現在、出力されるGLSLは構造体がアルファベット順に定義されるので依存関係が解決できません

Push Constantのlocationが指定できない

  • 2019/03/17現在、自動割り当てを調整することで実質的に固定できます
    • Intelのドライバでは、コード中に参照される順番によって順々に割り振るようなので、割り振りたい順に値を取り出すと良いでしょう

Renderdoc

SSBOの番号の順序が入れ替わっている

  • コード中に出現する順番に表示されている
  • 実行中も?
    • 実行中は問題なさそう