Почніть з пошуку всіх груп об’єктів, де група об’єктів - це сукупність об'єктів, які перекриваються. Стандартне виявлення зіткнень повинно зробити цю роботу. Призначте кожній групі унікальний колір. Будь-який колір зробив би.
Надайте всі свої об'єкти суцільними кольорами, використовуючи груповий колір, текстуру.
Створіть нову контуру текстури з тими ж розмірами, що й ціль візуалізації. Перегляньте кожен тексель цілі візуалізації та визначте, чи він відрізняється кольором від будь-яких навколишніх текселів. Якщо це так, змініть відповідний текстур текстури контуру на потрібний колір лінії.
Нарешті, візьміть цю контурну текстуру та візьміть її на верхню частину зображення, яке ви хочете намалювати на екрані (можна, звичайно, зробити це одночасно з виявленням ребер у фрагменті шейдера і уникнути створення текстури краю в першому місце).
Якщо ви виконаєте цей крок на процесорі, використовуючи цикл для переходу через текстели цілі візуалізації, то це буде досить повільно, але, ймовірно, досить добре для тестування та навіть використання в деяких випадках. Щоб використовувати це в режимі реального часу, вам найкраще це обробити в шейдері.
Фрагмент шейдера для виявлення цього краю може виглядати приблизно так;
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);
}
Там, де друге значення тексту2D шукає, є 2d координатою відносно v_texCoord. Ви застосували б це, відображаючи першу ціль візуалізації як текстуру на повноекранному квадратику. Це схоже на те, як ви застосували блякані ефекти на весь екран, такі як розмиття у газі.
Причина використовувати першу ціль візуалізації суцільними кольорами - це просто переконатися, що між різними об'єктами, які перекриваються, немає сприйманого краю. Якщо ви просто виконали виявлення ребер на екрані зображення, ви, ймовірно, виявите, що він виявляє і краї в перекриттях (якщо припустимо, що об'єкти мають різні кольори / текстури / освітлення).