聚光灯在 libGDX 中不工作

spotlight not working in libGDX

我在 libGDX 中玩过 spotLight。我使用此代码在 -y 方向投射光源。令我惊讶的是,我的 floorModel 是全黑的。我去看了文档,发现了这个有趣的事实:

请注意,默认着色器不支持聚光灯,您必须提供自己的着色器才能使用此 class。

我认为这可能是什么聚光灯不起作用的原因。然而,我发现了 0 个正确设置聚光灯的例子。您能否提供一个正确设置聚光灯的简单示例?

为阅读第一个问题的人编辑:第二次导出自定义对象后,光交互按预期工作 - 这意味着仅使用聚光灯时对象不可见。不知道为什么。

public void show() {
       float factor=3f;
    camera = new PerspectiveCamera(45, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
    camera.position.set(1.4f * factor, 6f, -1f * factor);


    camera.lookAt(0f,0f,0f);
    camera.near =0.1f;
    camera.far = 300f;

    modelBatch = new ModelBatch();
    modelBuilder=new ModelBuilder();

    UBJsonReader jsonReader = new UBJsonReader();

    G3dModelLoader modelLoader = new G3dModelLoader(jsonReader);
    model = modelLoader.loadModel(Gdx.files.getFileHandle("convertedModel3.g3db", Files.FileType.Internal));
    floorModel = modelBuilder.createBox(30,1,30,new Material(ColorAttribute.createDiffuse(Color.BLUE)), VertexAttributes.Usage.Position|VertexAttributes.Usage.Normal);
    modelInstance = new ModelInstance(model);
    floorInstance=new ModelInstance(floorModel);

    Array<Material> materials=modelInstance.materials;

    materials.get(0).set(ColorAttribute.createDiffuse(Color.WHITE));
    materials.get(0).set(ColorAttribute.createReflection(Color.WHITE));


    float intensity = 0.1f;
    environment = new Environment();

    Vector3 pos = new Vector3(0,10,0);
    Vector3 dir = new Vector3(0,-10,0);

    environment.add(new SpotLight().set(Color.WHITE,pos,dir,1f,100,1));
}



@Override
    public void render(float delta) {
        Gdx.gl.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);

        camera.update();


        modelBatch.begin(camera);
        modelBatch.render(modelInstance, environment);
        modelBatch.render(floorInstance,environment);
        modelBatch.end();}

如文档所述,当前默认着色器不支持聚光灯。这是因为好的通用聚光灯需要按片段照明,而默认着色器使用按顶点照明。因此你不会找到一个简单的例子。您可以等待 this pull request 被包含在内。您可以使用它作为示例(尽管它可能对您的使用来说有点矫枉过正,而且肯定不简单)。或者您可以提供自己的包含聚光灯的着色器。

Here's a basic tutorial on how to create a shader. This wiki page 包含有关如何自定义着色器的更多信息。实际的着色器实现并不是 libGDX 具体的(统一名称除外),您可以使用与您的目标设备兼容的任何您喜欢的算法。

Here 您可以找到有关如何调整默认(逐顶点照明)着色器以在一定程度上支持聚光灯(质量取决于您的模型)的示例。请注意,对 DefaultShader class 的修改已经包含在内,在这种情况下,您只需关注实际的着色器 (GLSL) 程序。