Начните с поиска всех групп объектов, где группа объектов представляет собой набор объектов, которые перекрываются. Стандартное обнаружение столкновений должно делать эту работу. Присвойте каждой группе уникальный цвет. Подойдет любой цвет.
Визуализируйте все ваши объекты как сплошные цвета, используя групповой цвет, в текстуру.
Создайте новую текстуру контура с теми же размерами, что и цель рендеринга. Просканируйте каждый тексель цели рендеринга и определите, отличается ли он от любого окружающего текселя. Если это так, замените соответствующий текст в структуре контура на нужный вам цвет линии.
Наконец, возьмите эту текстуру контура и визуализируйте ее поверх изображения, которое вы хотите нарисовать на экране (вы, конечно, можете сделать это одновременно с определением края в фрагментном шейдере и избежать создания текстуры края в первом место).
Если вы выполните этот шаг на процессоре, используя цикл for, чтобы пройти через тексели цели рендеринга, то это будет довольно медленно, но, вероятно, достаточно хорошо для тестирования и даже использования в некоторых случаях. Чтобы использовать это в режиме реального времени, вам лучше всего справиться с этим в шейдере.
Фрагментный шейдер для обнаружения края может выглядеть следующим образом;
precision mediump float;
uniform sampler2D s_texture;
varying vec2 v_texCoord;
void main()
{
gl_FragColor = vec4(0.0);
vec4 baseColor = texture2D(s_texture, v_texCoord);
gl_FragColor += baseColor - texture2D(s_texture, top);
gl_FragColor += baseColor - texture2D(s_texture, topRight);
gl_FragColor += baseColor - texture2D(s_texture, right);
gl_FragColor += baseColor - texture2D(s_texture, bottomRight);
gl_FragColor += baseColor - texture2D(s_texture, bottom);
gl_FragColor += baseColor - texture2D(s_texture, bottomLeft);
gl_FragColor += baseColor - texture2D(s_texture, left);
gl_FragColor += baseColor - texture2D(s_texture, topLeft);
}
Где второе значение в texture2D искать - это 2d координата относительно v_texCoord. Вы примените это, визуализируя первую цель рендеринга как текстуру на полноэкранном квадре. Это похоже на то, как вы применили бы эффекты размытия на весь экран, такие как размытие по Гассу.
Причина использования первой цели рендеринга со сплошными цветами состоит в том, чтобы просто убедиться, что между различными объектами, которые перекрываются, нет видимых границ. Если вы просто выполнили обнаружение краев на изображении на экране, вы, вероятно, обнаружите, что оно также обнаруживает края в перекрытиях (при условии, что объекты имеют разные цвета / текстуры / освещение).