Libgdx 3D - Point Light显示黑盒子& rect(PointLight不工作)

时间:2015-12-13 21:49:34

标签: opengl 3d libgdx shader lighting

我正在创建一个3D场景,当前是一个盒子和矩形,并尝试启用光照。

  

当我创建一个PointLight并将其添加到环境时,一切都变为黑色?

我想做的就是创建一个三维场景并启用点光源,如太阳或来自某个点的光线并对对象进行着色。

代码:

environment = new Environment();
environment.add(new PointLight().set(1f, 1f, 1f, 0, 0, 20f, 100f));

modelBatch=new ModelBatch();

...

square=new ModelBuilder().createBox(300,300,300,new Material(ColorAttribute.createDiffuse(Color.GREEN)),
                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
squareinst=new ModelInstance(square);
squareinst.transform.setTranslation(-500,0,0);

-

sprites.get(0).setRotationY(sprites.get(0).getRotationY() + 1f);
sprites.get(1).setRotationY(sprites.get(1).getRotationY() - 1f);
squareinst.transform.rotate(1,0,0,1);

modelBatch.begin(camera);
for(Sprite3D sp:sprites)// has 3d rect models
     sp.draw(modelBatch,environment);
modelBatch.render(squareinst,environment);
modelBatch.end();

PointLight将一切变黑 enter image description here

不使用环境或灯光 enter image description here

根据我的调查,如果点光源不工作,那么一切都应该是黑色的,因为环境需要光线,它可以正常使用定向光(即使在旋转之后,只有矩形的背面是黑色的,我不是知道为什么)

libgdx版本1.6.1 - android studio 我在Android设备和桌面上检查了它

请我真的需要让这个PointLight工作,我不知道它是否会采用自定义着色器,如果是这样,请引导我一些链接,因为我没有着色器经验。我还读到Po​​intLight没有在某些设备上工作或者没有在opengl 2.0中工作,但我不确定。

我尝试了很多东西和价值观。我知道环境光,但这对我的情况毫无用处。定向灯的使用也有限(如果不起作用,可以用作后备)。

编辑:

现在正在工作,请查看以下答案:

  • 如果您使用大相机尺寸或大型号尺寸,请尝试在点光强度上添加更多零,直到光线可见。 enter image description here

1 个答案:

答案 0 :(得分:2)

这是一个非常简单的例子,显示了一个围绕球体旋转的点光源:

public class PointLightTest extends ApplicationAdapter {
    ModelBatch modelBatch;
    Environment environment;
    PerspectiveCamera camera;
    CameraInputController camController;
    PointLight pointLight;
    Model model;
    ModelInstance instance;

    @Override
    public void create () {
        modelBatch = new ModelBatch();
        camera = new PerspectiveCamera();
        camera.position.set(5f, 5f, 5f);
        camera.lookAt(0f, 0f, 0f);
        camController = new CameraInputController(camera);
        environment = new Environment();
        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1.0f));
        environment.add(pointLight = new PointLight().set(0.8f, 0.8f, 0.8f, 2f, 0f, 0f, 10f));

        ModelBuilder mb = new ModelBuilder();
        model = mb.createSphere(1f, 1f, 1f, 20, 10, new Material(ColorAttribute.createDiffuse(Color.GREEN)), Usage.Position | Usage.Normal);
        instance = new ModelInstance(model);

        Gdx.input.setInputProcessor(camController);
    }

    @Override
    public void resize (int width, int height) {
        camera.viewportWidth = width;
        camera.viewportHeight = height;
        camera.update();
    }

    @Override
    public void render () {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
        camController.update();
        pointLight.position.rotate(Vector3.Z, Gdx.graphics.getDeltaTime() * 90f);
        modelBatch.begin(camera);
        modelBatch.render(instance, environment);
        modelBatch.end();
    }

    @Override
    public void dispose () {
        model.dispose();
        modelBatch.dispose();
    }
}

请注意,灯光需要位于模型之外且在照亮模型的范围内。尝试逐渐将光线从模型或模型移开时会发生什么。另一个例子中的Renderable用于可视化光的这个位置。