Comience por encontrar todos los grupos de objetos, donde un grupo de objetos es una colección de objetos que se superponen. La detección de colisión estándar debería hacer el trabajo. Asigne a cada grupo un color único. Cualquier color haría.
Renderice todos sus objetos como colores sólidos, usando el color del grupo, a una textura.
Cree una nueva textura de contorno con las mismas dimensiones que el objetivo de renderizado. Escanee cada texel del destino de renderizado y determine si es de un color diferente al de los texel circundantes. Si es así, cambie el texel correspondiente en la textura del contorno al color de línea que desee.
Finalmente, tome esta textura de contorno y renderícela sobre la parte superior de la imagen que desea dibujar en la pantalla (por supuesto, puede hacer esto al mismo tiempo que la detección de bordes en un sombreador de fragmentos y evitar crear la textura de bordes en la primera sitio).
Si realiza este paso en la CPU utilizando un bucle for para recorrer los texels del objetivo de renderizado, entonces será bastante lento, pero probablemente lo suficientemente bueno como para probarlo e incluso usarlo en algunos casos. Para usar esto en tiempo real, sería mejor manejar esto en un sombreador.
Un sombreador de fragmentos para hacer esta detección de bordes podría verse así;
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);
}
Donde el segundo valor en la búsqueda de texture2D es una coordenada 2d relativa a v_texCoord. Aplicaría esto renderizando el primer objetivo de renderizado como la textura en un quad de pantalla completa. Esto es similar a cómo aplicaría efectos de desenfoque a pantalla completa, como un desenfoque guassiano.
La razón para usar el primer objetivo de renderizado con colores sólidos es simplemente para asegurarse de que no haya un borde percibido entre los diferentes objetos que se superponen. Si simplemente realizó la detección de bordes en la imagen de la pantalla, es probable que también detecte bordes en las superposiciones (suponiendo que los objetos tengan diferentes colores / texturas / iluminación).