bambooflow Note

Troubleshooting

最終更新:

Bot(ページ名リンク)

- view
メンバー限定 登録/ログイン

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



シェーダでinverseが使えない


OpenGL3.2のドライバがインストールされているはずなのになぜかinverseが使えなかった。

使用環境
  • Linux OS: Ubuntu 9.10 (32bit)
  • Video Driver : nVidia 195.36.15


次で解決できたっぽい。
#version 150
#extension GL_ARB_gpu_shader5 : enable
#extension GL_EXT_gpu_shader4 : enable


どうしてもないときは、自前で関数を用意。
mat3 inverse(mat3 a)
{
    float det_a;
    float inv_det_a;
    mat3 inv;
    det_a = 
        ( a[0][0]*a[1][1]*a[2][2]
        + a[0][1]*a[1][2]*a[2][0]
        + a[0][2]*a[1][0]*a[2][1]
        - a[0][0]*a[1][2]*a[2][1]
        - a[0][1]*a[1][0]*a[2][2]
        - a[0][2]*a[1][1]*a[2][0] );
 
    if (det_a == 0.0) { 
        inv[0][0] = inv[1][1] = inv[2][2] = 1.0;
        inv[0][1] = inv[0][2] = 
        inv[1][0] = inv[1][2] = 
        inv[2][0] = inv[2][1] = 0.0;
    } 
    else { 
        inv_det_a = 1.0 / det_a;
        inv[0][0] = inv_det_a * (a[1][1]*a[2][2] - a[1][2]*a[2][1]);
        inv[0][1] = inv_det_a * (a[2][1]*a[0][2] - a[2][2]*a[0][1]);
        inv[0][2] = inv_det_a * (a[0][1]*a[1][2] - a[0][2]*a[1][1]);
        inv[1][0] = inv_det_a * (a[1][2]*a[2][0] - a[1][0]*a[2][2]);
        inv[1][1] = inv_det_a * (a[2][2]*a[0][0] - a[2][0]*a[0][2]);
        inv[1][2] = inv_det_a * (a[0][2]*a[1][0] - a[0][0]*a[1][2]);
        inv[2][0] = inv_det_a * (a[1][0]*a[2][1] - a[1][1]*a[2][0]);
        inv[2][1] = inv_det_a * (a[2][0]*a[0][1] - a[2][1]*a[0][0]);
        inv[2][2] = inv_det_a * (a[0][0]*a[1][1] - a[0][1]*a[1][0]);
    } 
    return inv;
}
 

タグ:

OpenGL GLSL
記事メニュー
ウィキ募集バナー