代码之家  ›  专栏  ›  技术社区  ›  killexe

单位分辨率问题,缩小时网格有洞

  •  0
  • killexe  · 技术社区  · 6 年前

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

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

    Some triangles are missing

    我的第一个想法是我有不同的决心,但事实并非如此。我在服务器和客户端上都有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;
    }
    
    
    0 回复  |  直到 6 年前
        1
  •  3
  •   killexe    6 年前

    天哪,我真不敢相信我犯了这么愚蠢的错误。 毕竟 解决问题。

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

        2
  •  1
  •   localhost    6 年前

    在讨论此问题的着色器详细信息之前,是否确定问题不在于在Unity中实现缩小功能的方式?这只是一种预感,因为我在旧项目中见过它,但如果放大/缩小功能通过实际移动相机来工作,那么当网格曲面超出范围时,剪切平面的移动将创建这些“孔”。虽然在共享图像中放置一些洞让我怀疑这是真的,但你永远不知道。

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