繁体   English   中英

libGDX 3D阴影

[英]libGDX 3D Shadows

我使用libGDX,这是一个桌面项目。

我有2个模型,一个是角色,另一个是地图,如下图所示:

在此输入图像描述

我的问题是:

如何在地板上投射角色的阴影?

你可以看到角色没有阴影,因此环境光。 我该使用什么或如何实现这一目标? 我应该假装阴影还是有真正的阴影投射方式?

欢迎提出任何意见或建议。

您可以使用以下代码:

Environment environment;
DirectionalShadowLight shadowLight;

@Override
public void show() {
    modelBatch = new ModelBatch(); 
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 1.0f, 1f, .6f, 1f));
    environment.add((shadowLight = new DirectionalShadowLight(1024, 1024, 60f, 60f, .1f, 50f))                  
                .set(1f, 1f, 1f, 40.0f, -35f, -35f));   
    environment.shadowMap = shadowLight; 

    shadowBatch = new ModelBatch(new DepthShaderProvider());
}

@Override
public void render(float delta) {
        //create shadow texture
        shadowLight.begin(Vector3.Zero, camera.direction);
        shadowBatch.begin(shadowLight.getCamera());

        shadowBatch.render(instances);

        shadowBatch.end();
        shadowLight.end();

        //render scene
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);


        modelBatch.begin(cam);      
        modelBatch.render(instances, environment);  //environment has shadowMap!
        modelBatch.end();
}

在2015年的某个时候,libGDX测试平台上增加了一个更好的阴影系统,与@ Nolesh的答案中提到的“实验性,不使用”的东西分开。

代码在libGDX测试中 ,因此您需要将其复制到您自己的项目中。 它的工作原理的简短描述由作者realitix 发布在libGDX论坛上 请注意,似乎没有完全可运行的示例,但ShadowSystem接口的JavaDoc包含以下内容:

// Init system:
Array<ModelBatch> passBatches = new Array<ModelBatch>();
ModelBatch mainBatch;
ShadowSystem system = new XXXShadowSystem();
system.init();
for (int i = 0; i < system.getPassQuantity(); i++) {
    passBatches.add(new ModelBatch(system.getPassShaderProvider(i)));
}
mainBatch = new ModelBatch(system.getShaderProvider());

// Render scene with shadows:
system.begin(camera, instances);
system.update();
for (int i = 0; i < system.getPassQuantity(); i++) {
    system.begin(i);
    Camera camera;
    while ((camera = system.next()) != null) {
        passBatches.get(i).begin(camera);
        passBatches.get(i).render(instances, environment);
        passBatches.get(i).end();
    }
    camera = null;
    system.end(i);
}
system.end();

HdpiUtils.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

mainBatch.begin(cam);
mainBatch.render(instances, environment);
mainBatch.end();

它不如拥有适当的阴影API,但比从头开始实现整个事情更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM