将一个视图中的可见像素投影到另一个视图中

Project visible pixels in one view onto another

在 WebGL 或纯矩阵数学中,我想将一个视图中的像素与另一个视图中的像素相匹配。也就是说,假设我采用 x,y = 0,0 的像素。在我的世界中,这个像素位于 3d 对象的表面。然后我稍微绕着物体旋转。位于 0,0 的像素现在位于我的新视图中的什么位置?

如何计算第一个视图中的每个像素与第二个视图中的每个像素之间的对应关系?

所有这一切的目标是 运行 一种遗传算法,以生成从多个方向破坏形状的伪装图案。

所以我想从多个角度了解在对象上添加纹理的效果。我想要像素对应关系,因为一直渲染会太慢。

要将一个点从世界坐标转换为屏幕坐标,您需要将它乘以视图和投影矩阵。因此,如果您在屏幕上有一个像素,您可以将其坐标(所有三个轴的范围 -1..1)乘以逆变换以找到世界中的对应点 space,然后将其乘以新的 view/projection下一帧的矩阵。

要注意的是,如果要查找网格点的移动,则需要正确的深度(Z 坐标)。为此,您可以通过该像素追踪光线并以困难的方式找到它与网格的交点,或者您可以通过先将其渲染到纹理来简单地读取 Z 缓冲区的内容。

类似的技术用于运动模糊,其中每个像素的速度在片段着色器中计算。详细解释见GPU Gems 3 ch27.

我用这个技术做了一个 jsfiddle:http://jsfiddle.net/Rivvy/f9kpxeaw/126/

相关片段代码如下:

// reconstruct normalized device coordinates
ivec2 coord = ivec2(gl_FragCoord.xy);
vec4 pos = vec4(v_Position, texelFetch(u_Depth, coord, 0).x * 2.0 - 1.0, 1.0);
// convert to previous frame
pos = u_ToPrevFrame * pos;
vec2 prevCoord = pos.xy / pos.w;
// calculate velocity
vec2 velocity = -(v_Position - prevCoord) / 8.0;