У меня возникли проблемы с 3D-тенями libgdx. В своей игре я реализовал экспериментальный DirectionalShadowLight. И все отлично работает на рабочем столе, однако, когда я запускаю его на Android, на земле появляется много артефактов.
Картинка (слева-андроид, справа-десктоп):
Я взял код рендеринга почти напрямую из тестов в репозиториях libgdx на github.
Gdx.gl.glClearColor(ExtendedEnvironment.FarBackgroundColor.r,ExtendedEnvironment.FarBackgroundColor.g,ExtendedEnvironment.FarBackgroundColor.b,1);
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
terrain.prepareForShadows();
environment.shadowLight.begin(new Vector3(cam.position.x+10,0,0), cam.direction);
shadowBatch.begin(environment.shadowLight.getCamera());
ball.draw(shadowBatch, null);
terrain.draw(shadowBatch, null);
shadowBatch.end();
environment.shadowLight.end();
terrain.recoverFromShadows(ball.getPosition().x);
Там не так много. Также, учитывая, что он работает на рабочем столе, я думаю, что что-то не так с самой реализацией теней. Могу ли я что-нибудь сделать, чтобы исправить это? Учитывая, что я никогда в жизни не прикасался к шейдеру. Может быть, какой-нибудь простой хак? Если нет, может быть, кто-нибудь может порекомендовать другую рабочую теневую реализацию для libgdx?
Спасибо.
РЕДАКТИРОВАТЬ: дополнительный код:
BlendingAttribute blendAttribute = new BlendingAttribute(1f)
IntAttribute intAttribute = IntAttribute.createCullFace(GL20.GL_FRONT);
public void prepareForShadows(){
batchedCubesInstance.materials.first().remove(blendAttribute.type);
batchedCubesInstance.materials.first().remove(intAttribute.type);
}
public void recoverFromShadows(float posX){
batchedCubesInstance.materials.first().set(blendAttribute);
batchedCubesInstance.materials.first().set(intAttribute);
}
//creating the batchedMesh:
ModelBuilder builder = new ModelBuilder();
builder.begin();
MeshPartBuilder mpb = builder.part("cubes", GL20.GL_TRIANGLES, (Usage.Position | Usage.Normal | Usage.Color), new Material(
IntAttribute.createCullFace(GL20.GL_FRONT),//For some reason, libgdx ModelBuilder makes boxes with faces wound in reverse, so cull FRONT
blendAttribute = new BlendingAttribute(1f), //opaque since multiplied by vertex color
new DepthTestAttribute(true), //don't want depth mask or rear cubes might not show through
ColorAttribute.createDiffuse(Color.WHITE) //white since multiplied by vertex color
));
for (int i=0; i < NUMCUBES; i++){
mpb.box(1, 1, 1);
}
batchedCubes = builder.end();
batchedCubesInstance = new ModelInstance(batchedCubes);
terrain.prepareForShadows();
иterrain.recoverFromShadows
? похоже, что ваш ландшафт вообще не должен отбрасывать тени, поэтому не визуализируйте их в shadowLight. - person Xoppa   schedule 09.08.2014IntAttribute.createCullFace(GL20.GL_FRONT)
, если у вас возникнут какие-либо проблемы после этого для нормального рендеринга, затем накрутите вершины против часовой стрелки (по умолчанию glFrontFace – GL_CCW). Дополнительная информация: opengl.org/wiki/Face_Culling - person Xoppa   schedule 10.08.2014Gdx.gl.glFrontFace(GL20.GL_CW);
как я упоминал в предыдущем комментарии. - person Xoppa   schedule 10.08.2014