DrawUserPrimitives <VertexPositionTexture>жалуется на отсутствие Color0 для вершинного шейдера - PullRequest
1 голос
/ 29 октября 2011

Прежде всего, я новичок в XNA и в том, как работает GPU и как он взаимодействует с API XNA (или DirectX).

У меня есть многоугольник для рисования с использованием SpriteBatch. Я делаю триангуляцию многоугольника и создаю массив VertexPositionTexture для хранения вершин. Я устанавливаю вершины (и просто для простоты устанавливаю вектор смещения текстуры на ноль) и пытаюсь нарисовать примитивы, но получаю эту ошибку:

The current vertex declaration does not include all the elements required by the current vertex shader. Color0 is missing.

Вот мой код, я дважды проверил свои векторы из триангуляции, они в порядке:

        VertexPositionTexture[] vertices = new VertexPositionTexture[triangulationResult.Count * 3];
        int ctr = 0;
        foreach (var item in triangulationResult)
        {
            foreach (var point in item.Vertices)
            {
                vertices[ctr++] = new VertexPositionTexture(new Vector3(point.X, point.Y, 0), Vector2.Zero);
            }
        }

        sb.GraphicsDevice.DrawUserPrimitives<VertexPositionTexture>(PrimitiveType.TriangleList, vertices, 0, triangulationResult.Count);

Что я, возможно, делаю здесь неправильно?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Ваш шейдер ожидает цвет в потоке вершин .... поэтому вы должны использовать VertexPositionColorTexture или изменить свой шейдер.

Похоже, вы не используете какой-либо шейдер. Если активный шейдер используется для spritebatch, вы не сможете нарисовать его правильно.

    VertexPositionColorTexture[] vertices = new VertexPositionColorTexture[triangulationResult.Count * 3];
    int ctr = 0;
    foreach (var item in triangulationResult)
    {
        foreach (var point in item.Vertices)
        {
            vertices[ctr++] = new VertexPositionColorTexture(new Vector3(point.X, point.Y, 0), Color.White, Vector2.Zero);
        }
    }

    sb.GraphicsDevice.DrawUserPrimitives<VertexPositionColorTexture>(PrimitiveType.TriangleList, vertices, 0, triangulationResult.Count);
1 голос
/ 29 октября 2011

Используйте BasicEffect, если вы рисуете полигоны ( Учебник по MSDN ). Вы должны использовать SpriteBatch только для рисования спрайтов (то есть, используя Draw методы).

Тип элемента вершины, который требуется BasicEffect, будет зависеть от того, какие настройки вы к нему примените.

Чтобы использовать тип элемента вершины без цветового компонента (например, VertexPositionTexture), установите BasicEffect.VertexColorEnabled в false.

Или, альтернативно, используйте тип элемента вершины, который предоставляет цвет, например VertexPositionColorTexture.

Если вы хотите создать BasicEffect с той же системой координат, что и SpriteBatch, см. этот ответ или в этом сообщении в блоге .

...