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 缓冲区精度随距离下降,对象有更多“闪烁”GPU 无法确定哪个多边形位于顶部,因为 z 缓冲区值的尾部不够精确,无法区分 2 个几乎相等的值。

你有 6 种方法来解决它:

  1. 移动几何图形或不显示下方的部分。

  2. 在OpenGL中使用多边形偏移之类的东西

  3. 使用 CPU z-sorting 而不是 z-buffer。

  4. 仅使用一个具有 2 个纹理的对象而不是 2 个对象 + 一些着色器(我不知道您到底想要实现什么)

  5. 使用更大的 z 缓冲区。

  6. 将剪裁平面彼此靠近,这将提高精度。

于 2012-11-26T12:19:09.537 回答