来自细分控制点的边缘上的伪像

时间:2018-04-22 02:56:12

标签: opengl artifacts tessellation

第一张图片显示近距离的神器: Close-up of clear color showing through

,第二个在上下文中显示它(见右下角): artifacts in lower right side

网格是由n x n个顶点的网格构建的,这些顶点被三角化以形成网格。顶点以1 / n为单位分隔。看起来通过连接网格中原始顶点的线条(产生网格)显示gl clear color。清晰颜色显示的线条形成四边形。每个曲面细分补丁的顶点数为3.如果没有镶嵌,则不存在该工件。启用细分后,工件会出现,但不会随着细分因子的变化而变得更加明显或更不明显。有没有人因为曲面细分而看到这样的文物?如果是这样,他们的根本原因是什么,是否有任何修复?我开始怀疑一些数字错误,但在镶嵌细分之前缩放地形也不会影响此工件的可见性。

根据要求,以下是相关的代码:

苔丝控制:

float GetTessLevel(float d1, float d2) {
    return 2;
}

void main() {
    TEworldPos[gl_InvocationID] = TCworldPos[gl_InvocationID];
    float EyeToVertexDistance0 = distance(cameraPos, TCworldPos[0]);
    float EyeToVertexDistance1 = distance(cameraPos, TCworldPos[1]);
    float EyeToVertexDistance2 = distance(cameraPos, TCworldPos[2]);

    // Calculate the tessellation levels
    gl_TessLevelOuter[0] = GetTessLevel(EyeToVertexDistance1, EyeToVertexDistance2);
    gl_TessLevelOuter[1] = GetTessLevel(EyeToVertexDistance2, EyeToVertexDistance0);
    gl_TessLevelOuter[2] = GetTessLevel(EyeToVertexDistance0, EyeToVertexDistance1);
    gl_TessLevelInner[0] = gl_TessLevelOuter[2];

苔丝伊娃:

uniform mat4 viewProj;
void main() {
vec3 posFromBary = gl_TessCoord.x * TEworldPos[0] +
                       gl_TessCoord.y * TEworldPos[1] +
                       gl_TessCoord.z * TEworldPos[2];
gl_Position = viewProj * vec4(posFromBary, 1.0);
}

1 个答案:

答案 0 :(得分:0)

问题是由至少出现在Intel Iris Pro 1536 MB集成GPU上的GPU错误引起的。调用管道中的任何GLSL noise functions也会细分至少一个补丁会导致这些工件。噪声本身和曲面细分本身按预期工作,但组合在曲面细分贴片的边缘产生小的伪像,如上例所示。一个临时的解决方法是使用this open-source glsl simplex noise implementation(此repo中的其他人可能运行良好,但我只测试了这个),与tesselation结合使用时不会产生任何伪影。