独自の webGL エンジンで遅延レンダリングを開発しようとしています。稲妻を計算する準備はすべて整っていますが、深度バッファから位置を適切に再構築できません...
現在、JS を使用して CPU でシェーダーから計算を実行しようとしています。正しい位置を取得できたら、それをシェーダーに変換します。これはJSコードです:
var model = mat4.create();
var view = mat4.create();
var projection = mat4.perspective(mat4.create(), 45, gl.canvas.width/gl.canvas.height, 0.1, 100);
var pos = [0,0,-1,1];
var viewport = gl.getViewport();
var modelview = mat4.multiply(mat4.create(), view, model);
var viewprojection = mat4.multiply(mat4.create(), projection, view);
var mvp = mat4.multiply(mat4.create(), projection, modelview);
var posScreenCoords = vec4.transformMat4(vec4.create(), pos, mvp);
var vec3unproj = vec3.create();
vec3.unproject(vec3unproj, [posScreenCoords[0],posScreenCoords[1],posScreenCoords[2]], viewprojection, viewport);
モデルとビューが同一であるときに乗算するなど、役に立たない計算があることは知っていますが、ステップごとに表示するためだけにそれらを表示したいと思います。
ID では、カメラは [0,0,-1] ワールド座標に面しているため、この座標を MVP マトリックスで変換して画面座標を取得すると、画面の中心 [0 ,0,Z]、これは私が得ているものです。
この時点ですべて問題ありません。ここが私が立ち往生している場所です。私はシェーダーにいる場合と同じ環境を持っています。スクリーン座標である XY と Z があります。この座標をワールド座標に投影解除する必要があります。gl-matrix ライブラリを使用していますがvec3.unproject
、外部ソースから取得していませんが、目的の結果 [0,0,-1] が得られません。
var unprojectMat = mat4.create();
var unprojectVec = vec4.create();
vec3.unproject = function (out, vec, viewprojection, viewport) {
var m = unprojectMat;
var v = unprojectVec;
v[0] = (vec[0] - viewport[0]) * 2.0 / viewport[2] - 1.0;
v[1] = (vec[1] - viewport[1]) * 2.0 / viewport[3] - 1.0;
v[2] = 2.0 * vec[2] - 1.0;
v[3] = 1.0;
if(!mat4.invert(m,viewprojection))
return null;
vec4.transformMat4(v, v, m);
if(v[3] === 0.0)
return null;
out[0] = v[0] / v[3];
out[1] = v[1] / v[3];
out[2] = v[2] / v[3];
return out;
};
ここでテストを見ることができます。何か案は?ありがとう