Suchen Sie zunächst alle Objektgruppen, wobei eine Objektgruppe eine Sammlung von Objekten ist, die sich überlappen. Die Standardkollisionserkennung sollte den Job erledigen. Weisen Sie jeder Gruppe eine eindeutige Farbe zu. Jede Farbe würde reichen.
Rendern Sie alle Ihre Objekte als Volltonfarben mithilfe der Gruppenfarbe zu einer Textur.
Erstellen Sie eine neue Gliederungstextur mit denselben Abmessungen wie das Renderziel. Durchsuchen Sie jedes Texel des Renderziels und stellen Sie fest, ob es eine andere Farbe als die umgebenden Texel hat. Wenn dies der Fall ist, ändern Sie das entsprechende Texel in der Gliederungstextur in die gewünschte Linienfarbe.
Nehmen Sie abschließend diese Gliederungstextur und rendern Sie sie über das Bild, das Sie auf dem Bildschirm zeichnen möchten (Sie können dies natürlich gleichzeitig mit der Kantenerkennung in einem Fragment-Shader tun und vermeiden, die Kantenstruktur im ersten zu erstellen Platz).
Wenn Sie diesen Schritt auf der CPU ausführen, indem Sie eine for-Schleife verwenden, um die Texel des Rendering-Ziels zu durchlaufen, ist dies ziemlich langsam, aber wahrscheinlich gut genug, um es zu testen und in einigen Fällen sogar zu verwenden. Um dies in Echtzeit zu verwenden, sollten Sie dies am besten in einem Shader erledigen.
Ein Fragment-Shader für diese Kantenerkennung könnte folgendermaßen aussehen.
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);
}
Wobei der zweite Wert in der textur2D-Suche eine 2D-Koordinate relativ zu v_texCoord ist. Sie würden dies anwenden, indem Sie das erste Renderziel als Textur auf einem Vollbild-Quad rendern. Dies ähnelt dem Anwenden von Unschärfeeffekten im Vollbildmodus, z. B. einer Guassian-Unschärfe.
Der Grund für die Verwendung des ersten Renderziels mit Volltonfarben besteht einfach darin, sicherzustellen, dass zwischen verschiedenen überlappenden Objekten keine Kante wahrgenommen wird. Wenn Sie einfach eine Kantenerkennung auf dem Bildschirmbild durchführen, werden Sie wahrscheinlich feststellen, dass es auch Kanten an den Überlappungen erkennt (vorausgesetzt, die Objekte haben unterschiedliche Farben / Texturen / Beleuchtung).