Проблема с разрешением единства, сетка имеет отверстия при уменьшении - PullRequest
1 голос
/ 29 апреля 2019

У меня есть сервер, который визуализирует сетку, используя OpenGL с пользовательским фреймовым буфером.В моем фрагментном шейдере я записываю gl_primitiveID в выходную переменную.После этого я звоню glReadPixels, чтобы прочитать идентификаторы.Затем я знаю, какие треугольники были отрисованы (и, следовательно, видимы), и отправляю все эти треугольники клиенту, работающему в 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;
}

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Боже мой, я не могу поверить, что совершил такую ​​глупую ошибку.Ведь это БЫЛ проблема разрешения.

Я не звонил gl_Viewport (только при изменении размера окна).Очевидно, что при создании окна с glfwCreateWindow GLFW создает окно, но поскольку параметры являются только подсказками, а не жесткими ограничениями (как указано здесь: ссылка на glfw ), возможно, что они не совсем выполнены.Поскольку я прошел желаемый размер 1920 * 1080 (что также является моим разрешением), очевидно, область рисования фактически не получила размер 1920 * 1080, потому что для меню также есть место, необходимое для меню и т. Д.более низкое разрешение (если быть точным, это было 1920 * 1061) на сервере, что приводит к отсутствию треугольников на клиенте.

1 голос
/ 03 мая 2019

Прежде чем углубляться в детали шейдера для этой проблемы, уверены ли вы, что проблема не в том, как реализована функция уменьшения масштаба в Unity?Это просто догадка, так как я видел это в более старых проектах, но если функция увеличения / уменьшения масштаба работает, фактически перемещая камеру, то перемещение плоскостей отсечения создаст эти "дыры", когда поверхности сетки выходят за пределы диапазона.Хотя расположение некоторых из этих отверстий в общем изображении заставляет меня сомневаться, что это так, но вы никогда не узнаете.

Если так работает функция масштабирования, вы можете подтвердить это, посмотревв режиме редактора при уменьшении.Он отобразит положение плоскостей отсечения камеры относительно сетки.

...