libgdx - 聚光灯在 libGDX 中不起作用

标签 libgdx spotlight

我正在 libGDX 中使用 SpotLight。我使用此代码在 -y 方向投影光源。令我惊讶的是,我的地板模型完全是黑色的。我查阅文档并发现了这个有趣的事实:

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

我认为这可能是聚光灯不起作用的原因。然而,我发现了 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关于如何创建着色器。 This wiki page包含有关如何自定义着色器的更多信息。实际的着色器实现并非真正特定于 libGDX(统一名称除外),您可以使用与目标设备兼容的任何您喜欢的算法。

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

关于libgdx - 聚光灯在 libGDX 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383397/

相关文章:

java - addAction 总是将 actor 原点旋转 0,0,为什么?

macos - 创建一个查询在线数据的 Spotlight 插件?

macos - Spotlight或Alfred的“Open folder in Terminal”

android-studio - Gradle依赖错误

java - 无法在 LibGDX 上同时绘制字体和舞台

android - Scene2d 如何处理被触摸的 Actor ?(LibGDX)

swift - 在 Swift 2.2 中使用 Spotlight 列出 El Capitan 上已安装的应用程序

ios - 为本地 Spotlight 搜索设置关键字

database - 使用 Spotlight 作为应用程序的 "database"

java - Android LibGDX 制作纹理/文本 "Touch to Start"闪烁