2015-08-03 1 views
0

J'essaie de créer un éclairage 2D dans slick2D. Cependant le résultat n'est pas tout à fait ce que je cherche.Slick2d Eclairage avec multiplication

Actuellement, il fonctionne en dessinant la lumière sur une lightmap, puis en dessinant la lightmap à l'écran. Lorsque je dessine la lumière sur le lightmap, je n'utilise que le mode de dessin d'écran, et lorsque je dessine le lightmap, j'utilise le mode de dessin multiple.

Le résultat est this Dessin du lightmap en mode normal tirage this je reçois

J'ai utilisé l'image Lightmap dans Photoshop et changé le blendingMode de se multiplier et obtenu this.

Pour une raison quelconque, le résultat du photoshop est très sombre. Il semble beaucoup mieux dans Photoshop avant d'enregistrer, pas aussi sombre.

Ma question est maintenant comment puis-je me rapprocher du résultat de photoshop?

Ceci est mon code:

public class Light 
{ 

    public Vector2f Pos; 
    public static Image light; 
    public Image lightCopy; 
    public static Image lightmap; 

    private float size=256; 
    private static float maxSize=1024; 
    public Color lightColor = new Color(255,255,255,255);; 
    private static Graphics g2; 
    private static Graphics g3; 

    public static ArrayList<Light> LightList = new ArrayList<Light>(); 

    public static void init() throws SlickException 
    { 
     light = new Image("Light.png"); 

     lightmap = new Image(1920,1080); 

     g3=lightmap.getGraphics(); 
     maxSize=light.getWidth(); 
    } 


    public Light(Vector2f Pos) throws SlickException 
    { 
     this.Pos=Pos; 
     LightList.add(this); 
     lightCopy = light.copy(); 
     g2=lightCopy.getGraphics(); 
    } 

    public void updateSingle(GameContainer gc, ArrayList<Object> BlockingObjects) throws SlickException 
    { 
     lightCopy = light.copy(); 
     g2.setDrawMode(Graphics.MODE_NORMAL); 
     g2.setColor(Color.black); 
     Rectangle lightPosAndSize = new Rectangle(0,0,maxSize,maxSize); 
     g2.fill(lightPosAndSize); 
     Vector2f pos = new Vector2f((maxSize/2)-(size/2),(maxSize/2)-(size/2)); 
     g2.drawImage(light.getScaledCopy(size/maxSize),pos.x, pos.y); 
     for(int i=0;i!=BlockingObjects.size();i++) 
     { 
      Object temp = BlockingObjects.get(i); 
      String type = temp.getClass().getSimpleName(); 
      switch(type) 
      { 
      case "Circle": 
      { 
       Circle c = (Circle) temp; 
       caseCircle(c); 
       break; 
      } 
      default: 
      } 
     } 
     g2.flush(); 
    } 

    public void renderToLightMap(Graphics g) throws SlickException 
    { 
     g3.setDrawMode(Graphics.MODE_SCREEN); 
     g3.drawImage(lightCopy, Pos.x-maxSize/2, Pos.y-maxSize/2,lightColor); 
     g3.setDrawMode(Graphics.MODE_NORMAL); 
     g3.flush(); 
    } 

    public static void renderLightmap(Graphics g) 
    { 
     g.setDrawMode(Graphics.MODE_COLOR_MULTIPLY); 
     g.drawImage(lightmap, 0, 0); 
     g.setDrawMode(Graphics.MODE_NORMAL); 
    } 

    private void caseCircle(Circle c) 
    { 

    } 



    public static void renderAll(Graphics g, GameContainer gc,ArrayList<Object> BlockingObjects) throws SlickException 
    { 
     g3=lightmap.getGraphics(); 
     g3.setColor(new Color(0,0,0)); 
     g3.fill(new Rectangle(0,0,1920,1080)); 
     g3.flush(); 
     for(int i=0;i!=LightList.size();i++) 
     { 
      Light temp = LightList.get(i); 
      temp.updateSingle(gc, BlockingObjects); 
      temp.renderToLightMap(g); 
     } 
     renderLightmap(g); 
    } 

J'allais poster ce au forum slick2d, mais je ne avons pas reçu le mail d'activation, donc je ne pouvais pas créer un fil là.

J'espère que vous comprenez mon problème et si vous avez besoin de plus d'informations, je vais essayer de vous le fournir. J'espère que les liens de mes images fonctionnent également.

Répondre

0

J'ai résolu le problème moi-même.

j'ai changé la méthode render lightmap à cette

public static void renderLightmap(Graphics g) 
{ 
    GL11.glEnable(GL11.GL_BLEND); 
    GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA); 
    g.drawImage(lightmap, 0, 0); 
    GL11.glDisable(GL11.GL_BLEND); 
    g.setDrawMode(Graphics.MODE_NORMAL); 
}