全般
表示がおかしい
- 行列が転置状態になっているかも
- ベクトルを右から掛けてみる
- DXCの
-Zprオプションを使って、ベクトルを左から掛けてみる- オプションなしだと、GLSLでは
layout(row_major)が付与されます
- オプションなしだと、GLSLでは
コンピュートシェーダ
テクスチャをサンプリングできない
SampleではなくSampleLevelを使ってみる- コンピュートシェーダはLODをサポートしていないらしい
- 参考:https://forums.developer.nvidia.com/t/texture-sampler-in-compute-shader/22201
描画
深度テストと深度書き込みを有効にすると、オブジェクトが描画されない
- フレームごとに深度バッファをクリアしてみる
- 深度バッファがクリアされないと、最も小さい深度値が蓄積してしまい、シーン全体が深度テストに失敗するようになります
- 深度バッファを正しくクリアするには
glDepthMaskをGL_TRUEにするのを忘れないこと
ディスパッチ
コンピュートシェーダが動作しない
glDispatchComputeに0ではなく、1を渡してみる- いずれかが0だとグループの総数が0になって、結果としてシェーダが動作しません
フレームバッファ
glClearでフレームバッファを初期化できない
gl(ColorMaskやglDepthMaskをGL_TRUEにしてみるglClearも書き込みマスクの影響を受けます
バインドしても書き込み先が変化しない
glDrawBuffersもFBOの一部なので、FBO生成時に設定してやります
バッファ
glBindBufferRangeでバインドしたバッファがシェーダから見えない
- 構造体のサイズを大きめの2の倍数(256や512)になるよう調整してみる
glBindBufferRangeのoffsetは、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の番号の順序が入れ替わっている
- コード中に出現する順番に表示されている
- 実行中も?
- 実行中は問題なさそう