【问题标题】:Libgdx 3D - Point Light shows black box & rect (PointLight not working)Libgdx 3D - Point Light 显示黑框和矩形(PointLight 不工作)
【发布时间】:2016-03-19 07:53:31
【问题描述】:

我正在创建一个 3d 场景,目前是一个长方体和矩形,并尝试启用照明。

当我创建一个 PointLight 并将其添加到 Environment 时,一切都会变成黑色?

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

代码:

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 让一切变黑

不使用环境或灯光

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

libgdx 版本 1.6.1 - 安卓工作室 我在安卓设备和桌面上都检查过了

请我真的需要让这个 PointLight 工作,我不知道它是否需要自定义着色器,如果是这样,请指导我到一些链接,因为我没有着色器经验。我还阅读了有关 PointLight 无法在某些设备上运行或无法在启用了 opengl 2.0 的情况下运行的信息,但我不确定。

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


编辑:

它现在工作,检查下面的答案:

  • 如果您使用较大的相机尺寸或较大的模型尺寸,请尝试在点光源强度上添加更多零,直到灯光可见。

【问题讨论】:

  • 你的单位对于那种光强度来说太大了。使用 1 左右的单位,而不是 300 和 500。
  • 你好@Xoppa 我也尝试了所有这些值和灯光位置,我开始使用 0-1f 范围,然后我使用 100f,因为它是在 libgdx 测试中编写的,我什至尝试在发布之前更改这些值评论,但结果还是一样。
  • 请链接到建议的测试,以便可以修复它。也许从一些有效的东西开始,然后根据您的需要对其进行修改。 github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/….
  • @Xoopa 是的,这是同一个测试链接,我会尝试他们的 java 文件。如果可能,请发布您的任何工作示例。
  • 那个使用大约 1 的值,我可以保证它有效,因为我做到了 ;)

标签: opengl 3d libgdx shader lighting


【解决方案1】:

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

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 用于可视化灯光的这个位置。

【讨论】:

  • 谢谢,你让它看起来超级简单。我之前也在做同样的事情,但灯光位置、强度和模型尺寸值并不都合适。我的相机尺寸是 2845x1600,模型尺寸是 300x300,所以光强太小,我把光强改为 30000,然后就可以看到了。再次感谢,祝您有美好的一天。
  • 您确实应该使用大约 1 的值 (1f)。使用这些大值可能(将)在以后引起问题,例如浮点精度误差会在矩阵数学中快速累积(这是在幕后使用的)。
  • 你是对的,在任何比例的 1:1 相机尺寸的情况下,如屏幕尺寸的 1.x:1.x,你的光是可见的,但是当我创建 2560x1440 或 2845x1600 画布时对于游戏中的相机尺寸,光线在大型物体上不可见,只有在强度值较大时才可见。
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多