1

テクスチャのあるモデルの表示に問題があります。すべてが完璧に機能しますが、ループを使用してテクスチャを繰り返し、画面上で 20 X 20 の床を表現します。テクスチャが正しく繰り返されます。しかし、すべてのテクスチャでちらつきが発生する理由がわかりません...画像が互いに重なっていることに気付きました。ループが正しくコーディングされていることを確認しました。

スクリーンショットを参照してください: ここに画像の説明を入力

私のコード(ループ関数の生成地):

//Function draw - ground land
    private void draw_groundLand(Vector3 position_model_origin)
    {
        //example generation mode 4x4 cubes
        int[,,] MatriceWorldCube = new int[1,2,2];
        MatriceWorldCube[0, 0, 0] = 1;
        MatriceWorldCube[0, 0, 1] = 1;
        MatriceWorldCube[0, 1, 0] = 2;
        MatriceWorldCube[0, 1, 1] = 1;

        int height = MatriceWorldCube.GetLength(0);
        int width = MatriceWorldCube.GetLength(1);
        int length = MatriceWorldCube.GetLength(2);

        Vector3 pos_reference = position_model_origin;

        for (int thickness = 0; thickness < height; thickness ++)
        {

            for (int column = 0; column < width; column ++)
            {

                for (int line = 0; line < length ; line ++)
                {


                        // Copy any parent transforms.
                        Matrix[] transforms = new Matrix[model_ground_land1.Bones.Count];
                        model_ground_land1.CopyAbsoluteBoneTransformsTo(transforms);

                        // Draw the model. A model can have multiple meshes, so loop.
                        foreach (ModelMesh mesh in model_ground_land1.Meshes)
                        {
                            // This is where the mesh orientation is set, as well 
                            // as our camera and projection.
                            foreach (BasicEffect effect in mesh.Effects)
                            {
                                effect.EnableDefaultLighting();
                                effect.World = transforms[mesh.ParentBone.Index]  *
                            Matrix.CreateRotationY(cubeGroundLand1_modelRotation) * Matrix.CreateTranslation(position_model_origin);
                                effect.View = View;
                                effect.Projection = Projection;


                            }

                            // Draw the mesh, using the effects set above.
                            mesh.Draw();
                        }



                    position_model_origin.X = (float)(line +1);
                }
                position_model_origin.X = pos_reference.X;
                position_model_origin.Z = (float)(column +1);

            }
            position_model_origin.Z = pos_reference.Z;
            position_model_origin.Y = (float)(thickness+1);

        }
        position_model_origin.Y = pos_reference.Y;
        position_model_origin = pos_reference;
    }

よろしくお願いいたします。私は忍耐力を失います(週末全体で^^)

4

1 に答える 1

2

Zファイティングです。これまでのところ、距離とともに低下するZバッファの精度は、オブジェクトの「ちらつき」が多くなります。Zバッファ値のテールは、2つのほぼ等しい値を区別するのに十分な精度ではないため、GPUはどのポリゴンが上にあるかを判断できません。

それを修正する6つの方法があります:

  1. ジオメトリを移動するか、下にあるパーツを表示しないでください。

  2. OpenGLでポリゴンオフセットのようなものを使用する

  3. z-bufferの代わりにCPUz-sortingを使用します。

  4. 2つのオブジェクトといくつかのシェーダーではなく、2つのテクスチャを持つ1つのオブジェクトのみを使用します(正確に何を達成しようとしているのかわかりません)

  5. より大きなZバッファを使用します。

  6. クリップ面を互いに近づけると、精度が向上します。

于 2012-11-26T12:19:09.537 に答える