WebGL-反向变换从顶点着色器中的gl_位置检索顶点位置

WebGL-反向变换从顶点着色器中的gl_位置检索顶点位置,webgl,vertex-shader,Webgl,Vertex Shader,在我的简单WebGL应用程序中,我计算(顶点着色器的)gl_位置,如下所示: gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 包含(世界坐标)顶点位置 我一直在尝试用gl_位置做一个反向变换,以获得图像的值(x,y和z),但这个过程对我来说似乎有点棘手 我在应用程序中使用的数据和矩阵: 投影矩阵: [1.0282340049743652, 0, 0,

在我的简单WebGL应用程序中,我计算(顶点着色器的)gl_位置,如下所示:

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
包含(世界坐标)顶点位置

我一直在尝试用gl_位置做一个反向变换,以获得图像的值(x,y和z),但这个过程对我来说似乎有点棘手

我在应用程序中使用的数据和矩阵:

  • 投影矩阵:

    [1.0282340049743652, 0,                  0,                    0, 
    0,                   1.5423510074615479, 0,                    0, 
    0,                   0,                  -1.0004000663757324, -1, 
    0,                   0,                  -20.00400161743164,   0] 
    
  • 模型视图矩阵:

    [203830718994,          0.563721776008606,   -0.5349519848823547, 0, 
    -3.6513849721586666e-9, 0.6883545517921448,   0.7253743410110474, 0, 
    0.7771459817886353,     -0.45649290084838867, 0.4331955313682556, 0, 
    -0.00007212938362499699,-1000,                -9290,              1] 
    
  • [10.0,15.0,72.0]
  • vertex:是的同构版本:[10.0,15.0,72.0,1.0]
我采用这种方法模拟计算顶点着色器中gl_位置的过程:

    mat4.multiply(mvpro, modelViewMatrix,projectionMatrix);
    vec4.transformMat4(vertex, vertex, mvpro);
根据上述计算结果,我得到了新的顶点(应与gl_位置中的值相同):

然后,我应用了以下反向变换以获取原始顶点的坐标:

    mat4.invert(invMvpro,mvpro);
    vec4.transformMat4(vertex,vertex, invMvpro);
现在顶点是:

    [10.014994621276855, 14.986272811889648, 72, 1.0005537271499634].
如您所见,与原始值相比,上述值略有偏差[10,15,72]


我使用glMatrix版本2进行所有计算。

无意冒犯,但您的矩阵无法读取。。。您能将它们放在代码块中,并与新行上的列和行对齐吗?您似乎还发现了为什么单精度浮点并不总是足够的,以及为什么浮点运算顺序对于保持有限的精度非常重要:)对不起,格式太差了。希望修改后的版本看起来还可以。另外,矩阵有点奇怪,因为我实际上使用了一系列mat4.perspective、mat4.translate和mat4.rotate(glMatrix方法)来形成它们。如果稍微偏离的值是由浮点精度问题引起的,则应该可以。我只是想知道我对gl_位置的正变换和逆变换的方法是否可行。谢谢。它看起来或多或少是正确的,您需要注意的一点是,新的GPU符合IEEE 754标准,适用于单精度FP(Java也碰巧使用)。较旧的GPU则不是。即使如此,您也不应该期望在CPU和GPU上变换顶点,最终得到相同的结果;事实上,你不应该期望在GPU上得到两次相同的精确结果:)你通常会得到单精度FP“足够好”的结果。FP从来没有被设计成精确的,它解决了用可接受的精度损失表示非常大范围值的问题。谢谢,等等。只是想知道,openGL有一个glunproject,它可以进行类似的反向转换是吗?该函数是否也能产生“足够好”的结果?事实上,
glunproject(…)
实际上使用了双精度,它将比您当前使用的数学更精确。
    [10.014994621276855, 14.986272811889648, 72, 1.0005537271499634].