我正在研究穿越空间的3D模拟,其中有物体。 渲染的3D对象似乎是“透明的”:
球体大小相同。大的一个在前面。 模型颜色未设置为透明。 我假设渲染的顺序可能会导致它(如在2D中),并使对象可比较并在渲染之前对它们进行排序。这并没有解决问题。
以下是代码:
public void render(float delta) {
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
//We clear the screen
camera.update();
this._game_.modelBatch.begin(camera);
ModelInstance inst;
Orb closestOrb = null;
float minDistance = Float.MAX_VALUE;
for ( Orb orb : this._game_.orbsList)
{
if (orb.getZ()< _game_.player.getPosition().z)
{
inst = new ModelInstance(this._game_.orbModel);
inst.transform.setToTranslation(orb.getX(),orb.getY(),orb.getZ());
this._game_.modelBatch.render(inst, this._game_.environment);
if (minDistance > Physics.getDistacne(_game_.player.getPosition(),orb.getPosition()))
{
minDistance = Physics.getDistacne(_game_.player.getPosition(), orb.getPosition());
closestOrb = orb;
}
}
}
this._game_.modelBatch.end();
这是游戏中的模型代码:
modelBatch = new ModelBatch();//the screen uses this
modelBuilder = new ModelBuilder();
Material orbMaterial = new Material(ColorAttribute.createDiffuse(0.5f, 0.5f, 1f,1f));
//createDiffuse(Color.MAGENTA));
long orbAttributes = Usage.Position | Usage.Normal;
orbModel = modelBuilder.createSphere(Orb.STANDARD_ORB_SIZE,Orb.STANDARD_ORB_SIZE, Orb.STANDARD_ORB_SIZE,30,30, orbMaterial, orbAttributes);
environment = new Environment();
environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
orbsList = new ArrayList<Orb>();
for (int i = 0; i < SimGame.NUM_OF_ORBS; i++)
{
Orb orb = Orb.generateOrb(-SimGame.WORLD_SIZE,SimGame.WORLD_SIZE, Orb.STANDARD_ORB_SIZE);
orbsList.add(orb);
}
Collections.sort(orbsList);
答案 0 :(得分:1)
我不太了解libGDX,虽然我很了解LWJGL和openGL。
你遇到的问题是对象的深度没有被测试,这意味着可以在更近的对象上渲染更远的对象。我猜测在程序开始时你需要调用GL11.glEnable(GL11.GL_DEPTH_TEST)
。它在libGDX中可能有所不同。如果你找不到我会建议搜索'libGDX深度测试'或类似的东西谷歌。
答案 1 :(得分:0)
Depth-Buffering就是这里的问题。
根据this source,您在调用glClear
时启用它(请注意第二个参数):
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
所以它的外观,它应该正确渲染。我建议删除你的obejcts的顺序,因为它们应该根据它们相对于相机的位置自动计算。