Проблемы с текстурой текстурированного Quad, показывая черный - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь нарисовать текстурированный квад в XNA, используя пример кода из MSDN http://msdn.microsoft.com/en-us/library/bb464051.aspx

но вместо рисования в плоскости XY я рисую в плоскости XZ

Я инициализирую этот квад с этим this.quad = new Quad (Vector3.Zero, Vector3.Up, Vector3.Backward, 1, 1);

Я испробовал почти каждую комбинацию вектора Normal и Left, независимо от того, где нарисован квад, квад полностью черный.

что я здесь не так делаю? информация текстуры теряется, когда я передаю ее? я неправильно отображаю расположение текстур?

пс: Текстура, освещение включены.

public class Quad
{
    public VertexPositionNormalTexture[] Vertices;
    public Vector3 Origin;
    public Vector3 Up;
    public Vector3 Normal;
    public Vector3 Left;
    public Vector3 UpperLeft;
    public Vector3 UpperRight;
    public Vector3 LowerLeft;
    public Vector3 LowerRight;
    public int[] Indexes;


    public Quad(Vector3 origin, Vector3 normal, Vector3 up,
             float width, float height)
    {
            this.Vertices = new VertexPositionNormalTexture[4];
            this.Indexes = new int[6];
            this.Origin = origin;
            this.Normal = normal;
            this.Up = up;

            // Calculate the quad corners
            this.Left = Vector3.Cross(normal, this.Up);
            Vector3 uppercenter = (this.Up * height / 2) + origin;
            this.UpperLeft = uppercenter + (this.Left * width / 2);
            this.UpperRight = uppercenter - (this.Left * width / 2);
            this.LowerLeft = this.UpperLeft - (this.Up * height);
            this.LowerRight = this.UpperRight - (this.Up * height);

            this.FillVertices();
    }

    private void FillVertices()
    {
            Vector2 textureUpperLeft = new Vector2(0.0f, 0.0f);
            Vector2 textureUpperRight = new Vector2(1.0f, 0.0f);
            Vector2 textureLowerLeft = new Vector2(0.0f, 1.0f);
            Vector2 textureLowerRight = new Vector2(1.0f, 1.0f);

            for (int i = 0; i < this.Vertices.Length; i++)
            {
                    this.Vertices[i].Normal = this.Normal;
            }

            this.Vertices[0].Position = this.LowerLeft;
            this.Vertices[0].TextureCoordinate = textureLowerLeft;
            this.Vertices[1].Position = this.UpperLeft;
            this.Vertices[1].TextureCoordinate = textureUpperLeft;
            this.Vertices[2].Position = this.LowerRight;
            this.Vertices[2].TextureCoordinate = textureLowerRight;
            this.Vertices[3].Position = this.UpperRight;
            this.Vertices[3].TextureCoordinate = textureUpperRight;

            this.Indexes[0] = 0;
            this.Indexes[1] = 1;
            this.Indexes[2] = 2;
            this.Indexes[3] = 2;
            this.Indexes[4] = 1;
            this.Indexes[5] = 3;
    }
}

мой метод розыгрыша:

        graphicsDevice.BlendState = BlendState.AlphaBlend;

        Effect.World = Matrix.Identity;
        Effect.View = Camera.View;
        Effect.Projection = Camera.Projection;
        Effect.TextureEnabled = true;
        Effect.Texture = OilTexture;

        Effect.EnableDefaultLighting();
        Effect.PreferPerPixelLighting = true;


        foreach (EffectPass pass in oilEffect.CurrentTechnique.Passes)
        {
            pass.Apply();

            graphicsDevice.DrawUserIndexedPrimitives<VertexPositionNormalTexture>
                    (PrimitiveType.TriangleList,
                    Vertices,
                    0,
                    4,
                    Indexes,
                    0,
                    2);
        }

- я решил свою проблему. что-то пошло не так, когда я передавал texture2d через 3 места, теперь я рисую это из основного чертежа, и текстура теперь выглядит отлично.

1 Ответ

0 голосов
/ 12 ноября 2011

Есть много причин, по которым квад может быть черным, вот несколько вещей, которые я хотел бы сделать для отладки:

  • Выключите молнию и установите цвет вершины, чтобы обеспечить ориентацию квадакак я и ожидал.
  • Используйте образец текстуры, если это возможно, чтобы убедиться, что данные текстуры действительны (у меня много проблем с различными версиями конвейеров, не загружающими текстуры, потому что форматы оказались не такими, как я ожидал)DDS имеет подформаты, которые могут быть сложными, если вы создаете свои собственные данные)
  • Проверьте, видна ли текстура при выключенной молнии
  • После того, как вы включите молнию, вы хотите убедиться, что у вас естьзначения молнии, установленные для всех вершин
  • Попробуйте увеличить значение окружения вашей системы до полного значения

Если ничего из этого не работает, посмотрите внимательно на область, где вы проходите молнию вершинызначения, нормальные значения вершин и освещение до аппаратного обеспечения.

...