2015-08-03 5 views
0

Я пытаюсь создать некоторое 2d-освещение в slick2D. Однако результат не совсем то, что я ищу.Slick2d Освещение с умножением

В настоящее время он работает, рисуя свет на карту света, а затем рисует световую карту на экране. При рисовании света в световой карте я просто использую режим рисования экрана, а при рисовании световой карты я использую режим многократного рисования.

В результате this Обращая Lightmap с нормальным режимом дро я получаю this

Я использовал образ Lightmap в фотошопе и изменил blendingmode размножаться и получил this.

По какой-то причине результат фотошоп очень темный. Он выглядит намного лучше в фотошопе перед сохранением, а не темным.

Вопрос теперь в том, как мне приблизиться к результату фотошопа?

Это мой код:

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); 
    } 

Я собирался отправить это на slick2d форуме, однако я не Получать почту активации, так что я не мог создать поток там.

Надеюсь, вы поймете мою проблему, и если вам нужна дополнительная информация, я постараюсь предоставить вам ее. Надеюсь, ссылки моих изображений также работают.

ответ

0

Решил проблему самостоятельно.

Я изменил метод визуализации лайтмап к этому

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); 
}