【问题标题】:libGDX 3D ShadowslibGDX 3D 阴影
【发布时间】:2014-10-01 13:03:28
【问题描述】:

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

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

我的问题是:

如何将人物的影子投射到地板上?

如您所见,角色没有阴影,因此没有环境光。我必须使用什么或如何实现这一点?我应该假装阴影还是有真正的投影阴影的方法?

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

【问题讨论】:

  • 通过提供Environment 渲染模型并首先将DirectionalShadowLight 添加到环境中。但是,这是一个实验课。

标签: java 3d libgdx shadow


【解决方案1】:

在 2015 年的某个时候,一个更好的影子系统被添加到 libGDX 测试平台中,与 @Nolesh 的回答中提到的“实验性,请勿使用”的东西分开。

代码是in the libGDX tests,因此您需要将其复制到您自己的项目中。作者 realitix 的posted on the libGDX forums 对其工作原理进行了简短描述。请注意,似乎没有完全可运行的示例,但 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 好,但比必须从头开始实现整个事物要好。

【讨论】:

  • 谢谢@Thomas 的回答,你测试过这个方法吗?对我来说它不起作用:(你有什么更新吗?
  • 我用过它,它确实有效。但是你可能需要做一些额外的工作才能让它正确,比如调整参数等等。以下是适用于我的具体情况的方法:new RealisticShadowSystem( AABBNearFarAnalyzer(), FixedShadowMapAllocator(2048, 4), BoundingSphereDirectionalAnalyzer(), FrustumLightFilter())。您还需要将灯光添加到阴影系统中。但老实说,除了最琐碎的 3D 工作,我不会再使用 libGDX 了。它非常适合 2D,但缺少 3D API、功能和文档。
  • 是的,我知道,当我开始研究它时,它似乎是一个很好的工具,但现在我必须自己做一些事情,它在文档和维护方面太分散了。除了 Unity,你还知道其他开发 3D 游戏的好框架吗(尤其是在 Android 中)?
  • Godot 的 3D 一直在变得越来越好,但我目前只将它用于 2D。 Unreal 也可以在 Android 上运行,但我一点经验都没有。
  • 我试过了,将new XXXShadowSystem() 替换为@Thomas 评论中的代码,但阴影完全呈现为黑色。 (它们应该被环境光照亮。它的级别是 0.4。)此外,它们有锯齿状边缘,可以通过增加阴影贴图分辨率(2048)来缓解,有些被部分剔除(有一部分更靠近被剔除的相机,而更远的部分则不是)。 (这也可能取决于这些参数的设置。)@Nolesh(已接受)的答案对我来说效果很好。
【解决方案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();
}

【讨论】:

  • ShadowMap 和 DirectionalShadowLight 已弃用。希望看到一个新的答案。
  • 它实际上是一个夜间版本,可能会发生变化。想知道是否有适当的方法从定向光添加基本阴影。
  • 我最终通过渲染阴影来伪装灯光。
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2012-08-21
  • 2013-07-28
  • 1970-01-01
  • 2021-10-27
  • 2013-02-20
相关资源
最近更新 更多