Webgl 从深度重建三维世界位置

Webgl 从深度重建三维世界位置,webgl,deferred-rendering,Webgl,Deferred Rendering,我正在尝试在自己的webGL引擎上开发延迟渲染。 我已经准备好了计算闪电的一切,但是我不能从深度缓冲区重建出正确的位置 现在,我正在尝试使用JS在CPU上对着色器进行计算,如果我能够获得正确的位置,那么将其转换为着色器。 这是JS代码: var model = mat4.create(); var view = mat4.create(); var projection = mat4.perspective(mat4.create(), 45, g

我正在尝试在自己的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);
我知道有一些无用的计算,比如当模型和视图位于同一位置时,将它们相乘,但我希望它们只是为了一步一步地显示

在identity,摄像机面对[0,0,-1]世界坐标,所以当我用MVP矩阵变换这个坐标以得到屏幕坐标时,它应该在屏幕的中心产生一个点[0,0,Z],这就是我得到的

现在一切正常。这就是我被困的地方。我有相同的环境,就像我在着色器,我有一个XY,这是屏幕坐标,和一个Z。我必须把这个坐标系交给世界坐标系。 我正在使用gl矩阵库,但它没有
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;
};
你可以看到测试。有什么想法吗?谢谢