libgdx 3d シャドウに問題があります。私のゲームでは、実験的な 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);