我试图在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论坛发帖,但是我没有收到激活邮件,所以我无法在那里创建一个帖子。
希望您了解我的问题,如果您需要更多信息,我会尽力为您提供。希望我的图像链接也能正常工作。
答案 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);
}