Estoy recreando el juego clásico SPACE INVADERS, y actualmente estoy trabajando en escribir un shader que imitará el aspecto de la superposición de pantalla en las consolas retro. (Pondrían una pegatina enorme sobre todo el monitor para simular el color. Similar a lo que se puede ver en este video )
Estoy trabajando para obtener una versión muy cruda del sombreador que funcione en este momento, y esto es lo que tengo hasta ahora cuando noté un problema muy importante:
varying vec2 vTextureCoord; uniform sampler2D uSampler; void main(){ if(texture2D(uSampler, vTextureCoord).r > 0.0) if(vTextureCoord.y < 0.1) gl_FragColor = vec4(1.0,0,0,1.0); else gl_FragColor = vec4(1.0,1.0,1.0,1.0); else gl_FragColor = texture2D(uSampler, vTextureCoord); }Tenga en cuenta que estoy determinando el color de los píxeles según su posición relativa a su contenedor principal, diciendo que todos los píxeles en el 10 % superior del contenedor deben ser rojos y el resto debe mantener su color original. Sin embargo, a medida que los alienígenas se mueven hacia abajo en la pantalla, el contenedor se reposiciona y cambia de tamaño constantemente para contener perfectamente a cada alienígena, y esto hace que la fila superior de alienígenas siempre sea roja porque el 10% superior del contenedor se mueve hacia abajo con ellos. Esto se puede ver especialmente claro si le digo al sombreador que siempre emita un solo color (por ejemplo, blanco). El contenedor se convierte en un enorme bloque blanco que se mueve de un lado a otro y hacia abajo a través de la pantalla.
Y, un problema relacionado es que, dado que estoy usando la escala del vecino más cercano, el cambio de tamaño constante del contenedor principal también hace que los píxeles se desplacen constantemente, lo que se ve horrible. Si no aplico ningún sombreador, este problema no se ve, pero si aplico cualquier sombreador, incluso uno que siempre devuelve el color de entrada, de repente los píxeles comienzan a cambiar constantemente.
¿Cómo debo hacer para arreglar esto? Mi idea inicial fue bloquear el contenedor principal en su lugar y permitir que los niños se muevan dentro de él sin que se mueva con ellos, pero después de leer este hilo , parece que los mantenedores de PIXI son muy conscientes de que bloquear la posición y los límites de un contenedor es un gran no-no y nunca será posible sin anulaciones manuales (lo que estaría dispuesto a hacer, pero me preocupa que rompa un montón de otras cosas)
¿Hay otra forma de solucionar este problema? ¿Cómo puedo aplicar este sombreador (a cada elemento del juego) mientras garantizo que su punto de origen nunca se moverá? ¿O debería abordar esto desde una dirección totalmente diferente?