我使用TWGL创建一个NxN平面缓冲区,然后将其用作网格(TWGL.primitives.createPlaneBufferInfo),并在Z轴上相对于视频中的亮度值进行挤出。这一切看起来都很好,除了我在(-X,-Y)和(X,Y)象限中得到了奇怪的剪辑瑕疵。有关示例,请参阅随附的图像。。。

在此处输入图像描述

我看到了这个帖子这提出了类似的问题,并建议进行深度排序,但考虑到相对深度是在着色器中动态决定的,我甚至不清楚如何进行这种排序。还有一个建议是禁用深度测试和启用面部剔除,但这不起作用。我认为一定有其他选择,因为我所做的事情并不罕见。也许我需要以不同的方式生成网格?我也不清楚为什么这只会发生在四个象限中的两个象限。提前谢谢!

11
  • 如果增加视频的最低亮度级别,使其永远不为0,会发生什么情况?例如,如果每个像素的视频亮度值介于0和255之间,则将其重新映射为介于1和255。我认为这些伪影是由于视频应用到的平面由许多矩形组成,每个矩形又由两个三角形组成,而这两个三角形不在一个精确的平面上(浮点舍入错误),当应用视频亮度时,这些舍入错误可能会导致一些乘法“错误”如果乘以0(黑色=无高度)。 2020年3月27日21:18
  • 嗯,我进行了一个超级简单的“亮度”计算(当然我可以转换为HSL,但我只是想让它发挥作用)。我继续,将.01加到Z值上,这样它就永远不会是0。这似乎没有改变什么。这样的事情是你想要的吗? 2020年3月27日23:48
  • gl_Position=perspectiveMatrixUniform*viewMatrixUniform*vec4((matrixUnique*vec3(Position.xy,1.0)).xy,(intensity.r+intensity-g+intensight.b)/3.0+0.01,1.0); 2020年3月27日23:50
  • 请注意,添加.01基线Z值并没有导致问题消失 2020年3月27日23:50
  • 同样值得注意的是,当我把物体移到更右边或更低的位置时,问题会变得更严重。它根本不会发生在(-X,Y)或(X,-Y)象限。。。 2020年3月28日16:25

1答案1

重置为默认值
1

经过多次试验,我终于发现了问题。我正在生成的透视矩阵的第16个数组元素为零(换句话说,X、Y、Z、W矩阵中的位置[4,4]),这导致深度值变平。

我用twgl生成透视矩阵。不知道为什么实现是这样的(在我看来是个错误):

_public.perspectiveMatrix=twgl.m4.透视(_public.POV,宽度/高度,0.0,100);

这是一个问题,因为我在顶点着色器中的位置设置如下:

gl_Position=perspectiveMatrixUniform*viewMatrixUniform*vec4((matrixUnique*vec3(Position.xy,1.0)).xy,(intensity.r+intensity-g+intensight.b)/3.0+0.01,1.0);

如果我在初始化透视矩阵后立即添加以下行,则一切都会按预期运行:

_public.perspectiveMatrix[15]=1.0;

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.