У меня есть сервер, который визуализирует сетку, используя OpenGL с пользовательским фреймовым буфером.В моем фрагментном шейдере я записываю gl_primitiveID
в выходную переменную.После этого я звоню glReadPixels
, чтобы прочитать идентификаторы.Затем я знаю, какие треугольники были отрисованы (и, следовательно, видимы), и отправляю все эти треугольники клиенту, работающему в Unity.На этом клиенте я добавляю данные вершины и индекса к GameObject
, и он без проблем выводит их.Я получаю точно такой же результат рендеринга в Unity, как и в OpenGL, если только я не начинаю уменьшать масштаб.
Вот изображения сетки, отображаемой в Unity: ![Normal mesh](https://i.stack.imgur.com/iq244.png)
![Some triangles are missing](https://i.stack.imgur.com/LQIaK.png)
Моя первая мысль была о том, что у меня разные разрешения, но это не так.У меня 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;
}