【问题标题】:spotlight not working in libGDX聚光灯在 libGDX 中不起作用
【发布时间】:2016-03-26 19:15:33
【问题描述】:

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

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

我认为这可能是什么聚光灯不起作用的原因。但是,我发现了 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();}

【问题讨论】:

    标签: libgdx spotlight


    【解决方案1】:

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

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

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

    【讨论】:

    • 比我想象的要难...现在显示回光。我在使用 PointLight 时遇到了完全相同的问题,尽管文档没有说明处理点光源的任何例外情况。这就是我用来设置 PointLight 的方法: Vector3 pos = new Vector3(0,10,10); pointLight = new PointLight().set(Color.WHITE,pos,10); environment.add(pointLight);
    猜你喜欢
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多