【问题标题】:Unity resolution problem, mesh has holes when zooming outunity解析问题,网格缩小时有洞
【发布时间】:2019-04-29 16:32:17
【问题描述】:

我有一个服务器,它使用带有自定义帧缓冲区的 OpenGL 渲染网格。在我的片段着色器中,我将gl_primitiveID 写入输出变量。之后我打电话给glReadPixels 来读取 ID。然后我知道渲染了哪些三角形(因此可见),然后我将所有这些三角形发送到在 Unity 上运行的客户端。在这个客户端上,我将顶点和索引数据添加到GameObject,它可以毫无问题地渲染它。除非我开始缩小,否则我在 Unity 中得到的渲染结果与使用 OpenGL 得到的渲染结果完全相同。

以下是使用 Unity 渲染的网格的图片:

我的第一个想法是我有不同的分辨率,但事实并非如此。我在服务器和客户端上都有 1920*1080。我在服务器上使用来自客户端的相同视图和投影矩阵,所以这也不应该是问题。这个错误可能是什么原因?

如果你需要看我写的一些代码。

这是我的顶点着色器代码:

#version 330 core
layout (location = 0) in vec3 position;

uniform mat4 view;
uniform mat4 projection;

void main()
{
   gl_Position = projection * view * vec4(position, 1.0f);
}

这是我的片段着色器代码:

#version 330 core
layout(location = 0) out int primitiveID;

void main(void)
{ 
   primitiveID = gl_PrimitiveID + 1; // +1 because the first primitive is 0
}

这是我的getVisibleTriangles 方法:

std::set<int> getVisibleTriangles() {
    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glReadPixels(0, 0, SCR_WIDTH, SCR_HEIGHT, GL_RED_INTEGER, GL_INT, &pixels[0]);

    std::set<int> visibleTriangles;
    for (int i = 0; i < pixelsLength; i += 4) {
        int id = * (int*) &pixels[i];
        if (id != 0) {
            visibleTriangles.insert(id-1); // id 0 is NO_PRIMITIVE
        }
    }
    return visibleTriangles;
}

【问题讨论】:

  • 您是否启用了任何类型的抗锯齿功能?在可能影响每个像素抓取哪个三角形的服务器上。
  • 如果 OpenGL 默认不做任何抗锯齿,就不应该做,但我也会检查一下,谢谢你的提示。
  • 好的,所以我检查了这个并没有启用多重采样。

标签: unity3d opengl rendering resolution


【解决方案1】:

天哪,我不敢相信我犯了这么愚蠢的错误。 毕竟它一个分辨率问题。

我没有调用gl_Viewport(仅在调整窗口大小时)。显然,当使用 glfwCreateWindow GLFW 创建窗口时,会创建窗口,但由于参数只是提示而不是硬约束(如此处所述:glfw reference),这些参数可能并未完全实现。由于我已经通过了所需的 1920*1080 大小(这也是我的分辨率),显然绘图区域实际上并没有得到 1920*1080 的大小,因为菜单等也需要一些空间。所以它是用服务器上的分辨率较低(准确地说是 1920*1061),导致客户端缺少三角形。

【讨论】:

    【解决方案2】:

    在了解此问题的着色器详细信息之前,您确定问题不在于 Unity 中实现缩小功能的方式吗?这只是一种预感,因为我在旧项目中看到过它,但如果放大/缩小功能通过实际移动相机起作用,那么当网格表面超出范围时,剪裁平面的移动将创建那些“洞”。尽管在共享图像中放置其中一些孔让我怀疑是这种情况,但你永远不知道。

    如果这恰好是缩放功能的工作方式,那么您可以通过在缩小时查看编辑器模式来确认这一点。它将显示相机的剪切平面相对于网格的位置。

    【讨论】:

    • 我目前的做法是,我将相机矩阵和投影矩阵从 Unity 发送到我的服务器。我使用的视图矩阵是Camera.main.worldToCameraMatrix,投影矩阵是Camera.main.projectionMatrix 然后在服务器上我只是设置了带有制服的矩阵,正如您在着色器代码中看到的那样。所以我不希望那里有任何错误,但你永远不知道。谢谢你的建议,我会考虑的。
    • 我检查了相机的实现,缩放确实可以通过沿 z 轴移动位置来实现。但是我仍然不明白为什么这会导致问题,因为我使用相同的矩阵进行计算。那么服务器不应该有同样的漏洞吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多