我正在尝试编写一个着色器,在我的地平面上创建一个相当大的网格(顶点坐标约为 1000.0 或更多)。它工作得很好,直到我意识到从某个视角来看,一些顶点似乎“移动”了:
当分解它时,很明显着色器本身不是问题。当剥离几乎所有东西的着色器并将顶点坐标显示为颜色时,也会发生同样的事情:
#version 330 core
in vec3 VertexPos;
out vec4 outColor;
void main()
{
outColor = vec4(VertexPos.xz, 0, 1);
}
当我将相机移近时,偏移会变得更糟,而当我将其移远时,偏移会变得更好(或者如果我稍微向左或向右移动它就会消失)。现在位置和角度不是任意的。该平面仅由两个三角形组成,形成一个四边形。但是由于某些原因,它不是用 4 个顶点和 6 个索引绘制的,而是用 6 个顶点和 6 个索引绘制的。所以它实际上是这样绘制的(当然差距并不存在):
正如您可能已经猜到的那样,这种转变发生在两个三角形相交的边缘。在我看来,只有当这个边缘在我的最终图像中完全水平时才会发生这种情况。为了避免这个问题,我可以将平面缩小很多(我不想要)或者可能只用四个顶点绘制它(虽然没有尝试过)。尽管如此,我真的很想找到问题的根源。我怀疑它在裁剪屏幕外的顶点或类似的东西时与浮点精度有关,但我不能完全把手指放在上面。
有任何想法吗?
编辑:顶点着色器。这里真的没什么特别的:
#version 330 core
layout(location = 0) in vec3 position;
layout(std140) uniform GlobalMatrices
{
mat4 viewProjection;
vec3 camPos;
vec3 lightCol;
vec3 lightPos;
vec3 ambient;
};
uniform mat4 transform;
out vec3 VertexPos;
void main()
{
vec4 transformed = transform * vec4(position, 1.0);
VertexPos = transformed.xyz;
gl_Position = viewProjection * transformed;
}



