Opengl 来自镶嵌控制点的边上的瑕疵

Opengl 来自镶嵌控制点的边上的瑕疵,opengl,artifacts,tessellation,Opengl,Artifacts,Tessellation,第一幅图像近距离显示了工件: 第二个在上下文中显示(见右下角): 网格是由n x n个顶点组成的网格构建的,这些顶点通过三角剖分形成网格。顶点以1/n单位分隔。看起来gl clear颜色是通过连接网格中原始顶点的线显示的(生成网格)。显示清晰颜色的线条形成四边形。每个细分面片的顶点数为3。如果没有细分,则不存在工件。启用细分后,会出现瑕疵,但不会随着细分因子的变化而变得更加明显。有没有人见过这样的镶嵌效果?如果是,其根本原因是什么,是否有任何修复措施?我开始怀疑一些数字错误,但在细分之前缩放

第一幅图像近距离显示了工件:

第二个在上下文中显示(见右下角):

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

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

Tess控制:

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);
}

该问题是由至少在Intel Iris Pro 1536 MB集成GPU上存在的GPU缺陷引起的。调用管道中的任何同时细分至少一个面片的对象都会导致这些瑕疵。噪波本身和细分本身的工作原理与预期相同,但组合在一起会沿细分面片的边缘产生小瑕疵,如上面的示例所示。临时解决方法是使用(此repo中的其他方法可能工作得很好,但我只测试了此方法),当与镶嵌相结合时,不会产生任何瑕疵。

当您无法确保在两个相邻四边形中对同一条边进行了完全相似的镶嵌/修改时,通常会出现这些瑕疵。但为了给出更好的答案,您需要显示一些代码。@BDL我尝试将所有面片的细分因子都编码为2,但伪影仍然存在。如果硬编码为1,则一切看起来都正常。此时,细分着色器和求值器的代码与相同。不进行照明计算,片段着色器只是在任何地方返回黑色,以使调试更容易。