-2

第一张图片近距离显示了工件: 透出清晰色彩的特写

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

网格由 nxn 个顶点的网格构成,这些顶点经过三角剖分以形成网格。顶点以 1/n 个单位分隔。看起来 gl clear 颜色是通过连接网格中原始顶点的线显示的(导致网格)。显示清晰颜色的线条形成四边形。每个细分面片的顶点数为 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);
}
4

1 回答 1

0

该问题是由至少 Intel Iris Pro 1536 MB 集成 GPU 上似乎存在的 GPU 错误引起的。在也镶嵌至少一个补丁的管道中调用任何GLSL 噪声函数会导致这些伪影。噪声本身和镶嵌本身按预期工作,但如上例所示,沿镶嵌块的边缘组合会产生小的伪影。一个临时的解决方法是使用这个开源的 glsl 单纯形噪声实现(这个 repo 中的其他可能工作得很好,但我只测试了这个),它在与 tesselation 结合使用时不会产生任何伪影。

于 2018-04-23T17:49:00.343 回答