Slick2d Lighting 与 multiply

Slick2d Lighting with multiply

我正在尝试在 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 论坛上 post 这个,但是我没有收到激活邮件,所以我无法在那里创建主题。

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

我自己解决了这个问题。

我把渲染光照贴图方法改成了这个

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