2017-08-31 69 views
1

这是我第一次尝试创建一个基本的灯光系统,在顶部使用一个带有白色圆圈的黑色纹理。我读了关于这个问题的各种线索,但我只是不知道我做错了什么。LibGDX - 基本的2D照明,不知道该怎么做

我要的是周围是黑暗和光线很好白色,但改变spritebatch颜色的东西较深将导致光线更暗,即使我重新绘制质地轻

当颜色

所以这就是我想要的(通过强制质地轻取出5次这样做,但不是一个解决方案,这是一个黑客): what I get if I draw the light 5 times while darkening the screen

这是我得到的(仅1光纹理绘制,但不是很明显): what I get while darkening the spritebatch and resetting the color to draw the light

这是我得到不变暗spritebatch: what I get by drawing the light without darkening the spritebatch

主要代码:

Game.sb.begin(); 
//Make stuff darker 
Game.sb.setColor(0.1f, 0.1f, 0.1f,1f); 
sb.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 
lvl.render(); 
//Reset color 
Game.sb.setColor(1f, 1f, 1f,1f); 
sb.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA); 
//This draws all lights by drawing a texture with the above blending function 
lightM.render(); 
Game.sb.end(); 

灯光对象绘制方法:

Game.sb.setColor(c.r,c.b,c.g, 1f); 
Utils.drawTexture(Assets.get("sprites/lightcircle2.png", Texture.class), pos, size, true); 
Game.sb.setColor(1,1,1,1); 

我是不是做了某种错误与为setColor?使用帧缓冲我一直在考虑,但我不知道这是否会给我光效果我想

顺便说一句,这是我的质地轻(它的CC0):

lighttexture

回答

1

可以实现您的需求通​​过以下方式:

  1. 通过使用着色器。 Here是该视频上的一个小视频和article

  2. 通过使用FBO和混合,Here是我对这个主题的答案之一。

  3. 您可以在render()方法使用box2dlight,即使不使用box2dbody(如果你不希望任何阴影)

    World world = new World(new Vector2(0,0),false); 
    RayHandler rayHandler = new RayHandler(world); 
    rayHandler.setCombinedMatrix(stage.getCamera().combined); //<-- pass your camera combined matrix 
    new PointLight(rayHandler,1000, Color.WHITE,radius,x_position,y_position); 
    
    所有的渲染后

    而在最后一次通话rayHandler.updateAndRender();

+1

我会尝试使用FBO和混合,GLSL似乎很复杂,我不想使用box2dlights。谢谢! :d –