Slick2d照明与乘法

时间:2015-08-03 16:26:26

标签: java screen lwjgl slick2d lighting

我试图在slick2D中创建一些2D照明。然而,结果并不是我想要的。

目前,它正在将光线绘制到光照贴图上,然后将光照贴图绘制到屏幕上。当将光线绘制到光照贴图时,我只是使用屏幕绘制模式,并且在使用乘法绘制模式绘制光照贴图时。

结果是this 使用正常绘制模式绘制光照贴图,我得到this

我在photoshop中使用了Lightmap图像并将混合模式更改为乘法并得到this

由于某种原因,Photoshop的结果很暗。在保存之前它在photoshop中看起来要好得多,而不是很暗。

我现在的问题是如何更接近photoshop结果?

这是我的代码:

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论坛发帖,但是我没有收到激活邮件,所以我无法在那里创建一个帖子。

希望您了解我的问题,如果您需要更多信息,我会尽力为您提供。希望我的图像链接也能正常工作。

1 个答案:

答案 0 :(得分: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);
}