ОШИБКА Использование XNA Framework VertexBuffer IndexBuffer

Я создаю игру после работы над книгой XNA 4.0. Это будет 3D, но я уже застрял в создании ландшафта...

ОБНОВЛЕНИЕ: Все, что начинается здесь, является обновлением... Обновление ландшафта:

public void Update(Matrix view, Matrix projection)
    {
        View = view;
        Projection = projection;
        World = Matrix.CreateTranslation(-Width / 2f, 0, Height / 2f);
    }

Ничья местности:

public void Draw(GraphicsDevice g)
    {
        effect.CurrentTechnique = effect.Techniques["ColoredNoShading"];
        effect.Parameters["xView"].SetValue(View);
        effect.Parameters["xProjection"].SetValue(Projection);
        effect.Parameters["xWorld"].SetValue(World);
        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {

            pass.Apply();
         //g.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3, VertexPositionColorNormal.VertexDeclaration);
          g.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
        }
    }

Закомментированная строка работает, в обоих случаях я могу видеть ландшафт... Следующий код предназначен для инициализации Vertex и Index Buffer:

private void SetUpVertices(GraphicsDevice g)
    {
        float currentH;
        int currentI;
        vertices = new VertexPositionColorNormal[Width * Height];
        for (int x = 0; x < Width; x++)
        {
            for (int y = 0; y < Height; y++)
            {
                currentH = heightData[x,y];
                currentI = x + y * Width;
                vertices[currentI].Position = new Vector3(x, currentH , -y);
                if (currentH < minH + (maxH - minH) / 3)
                    vertices[currentI].Color = Color.ForestGreen;
                else if (currentH < maxH - (maxH - minH) / 3)
                    vertices[currentI].Color = Color.LawnGreen;
                else
                    vertices[currentI].Color = Color.White;
            }
        }
        SetUpIndices(g);
    }
    private void SetUpIndices(GraphicsDevice g)
    {
        indices = new int[(Width - 1) * (Height - 1) * 6];
        int counter = 0;
        for (int y = 0; y < Height - 1; y++)
        {
            for (int x = 0; x < Width - 1; x++)
            {
                int lowerLeft = x + y * Width;
                int lowerRight = (x + 1) + y * Width;
                int topLeft = x + (y + 1) * Width;
                int topRight = (x + 1) + (y + 1) * Width;

                indices[counter++] = topLeft;
                indices[counter++] = lowerRight;
                indices[counter++] = lowerLeft;
                indices[counter++] = topLeft;
                indices[counter++] = topRight;
                indices[counter++] = lowerRight;
            }
        }
        SetUpNormals(g);
    }
    private void SetUpNormals(GraphicsDevice g)
    {
        for (int i = 0; i < vertices.Length; i++)
        {
            vertices[i].Normal = Vector3.Zero;
        }
        int[] index = new int[3];
        Vector3 s1, s2, n;
        for (int i = 0; i < vertices.Length / 3; i++)
        {
            for (int y = 0; y < 3; y++)
                index[y] = indices[i * 3 + y];
            s1 = vertices[index[0]].Position - vertices[index[2]].Position;
            s2 = vertices[index[0]].Position - vertices[index[1]].Position;
            n = Vector3.Cross(s1, s2);
            for (int y = 0; y < 3; y++)
            {
                vertices[index[y]].Normal += n;
                vertices[index[y]].Normal.Normalize();
            }
        }
        FillBuffers(g);
    }
    private void FillBuffers(GraphicsDevice g)
    {
        VertexBuffer = new VertexBuffer(g, VertexPositionColorNormal.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
        VertexBuffer.SetData(vertices);
        IndexBuffer = new IndexBuffer(g, typeof(int), indices.Length, BufferUsage.WriteOnly);
        IndexBuffer.SetData(indices);
        g.Indices = IndexBuffer;
        g.SetVertexBuffer(VertexBuffer);
    }

Я не думаю, что это ошибка, потому что он работает с другой линией. Может быть ошибка с файлом .fx, который я использую. Если вы так думаете, я собираюсь переключиться на BasicEffects... (Вы могли заметить, что код взят из http://www.riemers.net/eng/Tutorials/XNA/Csharp/series1.php )

Спасибо за вашу помощь...

Ваш, Флориан


person Florian Reisinger    schedule 16.02.2013    source источник


Ответы (1)


(Ответ на исходную версию вопроса.)

Вы не устанавливаете буфер вершин и индексный буфер на графическом устройстве. Эти две строки кода (непроверенные) должны делать то, что вам нужно:

g.GraphicsDevice.Indices = indexBuffer;
g.GraphicsDevice.SetVertexBuffer(vertexBuffer);

Поместите их сразу после установки параметров эффекта (ef), перед циклом.

Буфер вершин предоставляет объявление вершины, которое запрашивает сообщение об исключении.


Редактировать после обновления вопроса. В новой версии вы устанавливаете буферы вершин и индексов, но не в том месте. Вам нужно устанавливать их на графическое устройство каждый кадр. Ваш код будет работать только в том случае, если ничего не изменит их после того, как вы установите их в FillBuffers. Но я предполагаю, что этот материал рисуется вне метода Draw вашего класса?

Если это что-то другое — SpriteBatch, даже оно работает с использованием буферов вершин и буферов индексов. Таким образом, он сбросит ваши настройки. (Стоит добавить, что он также устанавливает состояния рендеринга — в этом случае вам может понадобиться просмотреть этой статьи.)

person Andrew Russell    schedule 18.02.2013
comment
Привет спасибо. Я пытался настроить все, но теперь это работает. Если бы у меня была репутация, я бы разбил голосование :) - person Florian Reisinger; 18.02.2013
comment
Извините, ложная информация... Привет, спасибо. Я пытался все настроить, но теперь ошибка все та же: Текущее объявление вершины не включает все элементы, требуемые текущим вершинным шейдером. Цвет0 отсутствует. Я обновляю первоначальное описание.... - person Florian Reisinger; 18.02.2013
comment
@ Reisi007 Reisi007 Я думаю, что мой первый ответ правильный, и вы только что установили буферы вершин и индексов не в том месте. Я добавил обновление с, надеюсь, дополнительной информацией о том, что может происходить. Дайте мне знать, если это все еще не работает :) - person Andrew Russell; 19.02.2013