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;
}