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);
}
我正在尝试在 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);
}