2

XNA、特に色で地形を描画する際に問題があります (VertexPositionColorNormal と VertexPositionTextureNormal で発生します)。私のコードは次のとおりです。

public BasicEffect GetEffectForColoredTerrain()
{
    this.coloredTerrainEffect.EnableDefaultLighting();
    this.coloredTerrainEffect.SpecularPower = 0.01f; //Power of the light
    this.coloredTerrainEffect.AmbientLightColor = new Vector3(0.1f, 0.1f, 0.1f); //Color of the light when it reflects on a surface
    this.coloredTerrainEffect.EmissiveColor = new Vector3(1, 0, 0);
    this.coloredTerrainEffect.DirectionalLight0.Enabled = true; //Enable directional light
    this.coloredTerrainEffect.DirectionalLight0.DiffuseColor = (new Vector3(0.2f, 0.2f, 0.2f)); //Diffuse color
    this.coloredTerrainEffect.DirectionalLight0.SpecularColor = (new Vector3(0.2f, 0.2f, 0.2f)); //Specular color
    this.coloredTerrainEffect.DirectionalLight0.Direction = Vector3.Normalize(new Vector3(1, -1f, 1)); //Direction where the light comes from.
    this.coloredTerrainEffect.View = Camera.GetInstance().GetViewMatrix();
    this.coloredTerrainEffect.Projection = Camera.GetInstance().GetProjectionMatrix();
    this.coloredTerrainEffect.Alpha = (float)((float)Configuration.GetInstance().TerrainOpacity / (float)100);
    this.coloredTerrainEffect.VertexColorEnabled = true;

    return this.coloredTerrainEffect;
}

そして、地形を描画するためのこのコード:

RasterizerState rs = new RasterizerState();
rs.CullMode = CullMode.None;
WorldContent.CommonGraphicsDevice.RasterizerState = rs;
//Restore things that SpriteBatch can have overriden
WorldContent.CommonGraphicsDevice.BlendState = BlendState.AlphaBlend;
WorldContent.CommonGraphicsDevice.DepthStencilState = DepthStencilState.Default;
WorldContent.CommonGraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp;

BasicEffect shader = ShadersHandler.GetInstance().GetEffectForColoredTerrain();
foreach (EffectPass pass in shader.CurrentTechnique.Passes)
{
    pass.Apply();
    WorldContent.CommonGraphicsDevice.Indices = indexBufferVertices;
    WorldContent.CommonGraphicsDevice.SetVertexBuffer(vertexBufferVertices);
    WorldContent.CommonGraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexPositionColorNormalList.Length, 0, indicesVertices.Length / 3);
}

ただし、次の画像でわかるように、結果は非常に奇妙です。

横方向の地形

地形の底

色は、黄色から白へのグラデーション (上が黄色、下が白) です。ただし、Riemers チュートリアルのエフェクト ファイル (3D シリーズ 1 のeffects.fx) を使用すると、次のようにすべてが正しくなります。

横方向に良い地形

地形の良い底

必要に応じて、ここで効果コードを確認できます:効果ファイル

質問:ここで BasicEffect で何が起こっているか知っている人はいますか? Riemers ファイルを使用したいのですが (すべて問題ないようです)、透明度を使用する必要があり、BasicEffect オブジェクトがアルファ プロパティを提供してくれます。これは探しているものに最適です。

PD: VertexPositionNormalTexture を使用して、テクスチャ付きの地形でも同じ問題が発生します。

4

1 に答える 1

0

画像を見ると、ディレクショナル ライトのように、変色が非常にきれいな円になっているように見えます。BasicEffect の例で使用している DirectionalLight0 プロパティの設定を削除して、変色が修正されるかどうかを確認します。

于 2013-03-08T13:08:38.997 に答える