聚光灯在 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) 程序。
我在 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) 程序。