Модели отображаются черным цветом в XNA

Я пытался нарисовать простой куб в xna, но он отображается полностью черным. Я пробовал несколько разных моделей FBX. Поигрался с настройками моделей в пайплайне. Я также применяю базовую молнию всеми возможными способами. Он по-прежнему кажется черным.

Мой код:

 using Microsoft.Xna.Framework;
 using Microsoft.Xna.Framework.Graphics;
 using Microsoft.Xna.Framework.Input;
 using System;

namespace Game1
{

public class Game1 : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    BasicEffect effect;
    Texture2D floor;
    Model model;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        effect = new BasicEffect(graphics.GraphicsDevice);

        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        floor = Content.Load<Texture2D>("floor");
        model = Content.Load<Model>("cube");
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();


        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        var cameraPosition = new Vector3((float)Math.Cos((double)gameTime.TotalGameTime.TotalMilliseconds/1000)*20, 40, (float)Math.Cos((double)gameTime.TotalGameTime.TotalMilliseconds / 1000) * 20);
        var cameraLookAtVector = Vector3.Zero;
        var cameraUpVector = Vector3.UnitZ;

        effect.View = Matrix.CreateLookAt(
            cameraPosition, cameraLookAtVector, cameraUpVector);

        float aspectRatio =
            graphics.PreferredBackBufferWidth / (float)graphics.PreferredBackBufferHeight;
        float fieldOfView = Microsoft.Xna.Framework.MathHelper.PiOver4;
        float nearClipPlane = 1;
        float farClipPlane = 200;

        effect.Projection = Matrix.CreatePerspectiveFieldOfView(
            fieldOfView, aspectRatio, nearClipPlane, farClipPlane);

        effect.TextureEnabled = true;
        effect.Texture = floor;

        drawModel(model, effect.World, effect.View, effect.Projection);

        foreach (var pass in effect.CurrentTechnique.Passes)
        {
            pass.Apply();

            drawQuad(new Vector3[] {
                new Vector3(20,-20,0),
                new Vector3(-20,-20,0),
                new Vector3(-20,20,0),
                new Vector3(20,20,0),
            },2f);
        }


        base.Draw(gameTime);
    }

    public void drawQuad(Vector3[] p, float tiling)
    {
        VertexPositionNormalTexture[] verts = new VertexPositionNormalTexture[6];

        verts[0].Position = p[0];
        verts[1].Position = p[1];
        verts[2].Position = p[3];

        verts[3].Position = p[1];
        verts[4].Position = p[2];
        verts[5].Position = p[3];

        verts[0].Normal = p[0];
        verts[1].Normal = p[1];
        verts[2].Normal = p[3];

        verts[3].Normal = p[1];
        verts[4].Normal = p[2];
        verts[5].Normal = p[3];

        verts[0].TextureCoordinate = new Vector2(0, 0);
        verts[1].TextureCoordinate = new Vector2(0, tiling);
        verts[2].TextureCoordinate = new Vector2(tiling, 0);

        verts[3].TextureCoordinate = verts[1].TextureCoordinate;
        verts[4].TextureCoordinate = new Vector2(tiling, tiling);
        verts[5].TextureCoordinate = verts[2].TextureCoordinate;

        graphics.GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, verts, 0, 2);
    }

    public void drawModel(Model model, Matrix world, Matrix view, Matrix projection)
    {
        foreach (var mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                    effect.EnableDefaultLighting();
                    effect.DiffuseColor = Color.White.ToVector3(); 
                    effect.World = world;
                    effect.View = view;
                    effect.Projection = projection;
            }

            mesh.Draw();
        }
    }
}

}


person Voxed    schedule 05.10.2015    source источник


Ответы (1)


FBX не встраивает текстуры в сам файл модели, он просто сохраняет путь к файлу текстуры. Этот путь обычно указывается относительно места экспорта (но это зависит от инструмента).

Попробуйте поместить файл текстуры по тому же относительному пути, что и с местом экспорта, но в выходной каталог исполняемого файла. В противном случае файлы FBX доступны для чтения IIRC, поэтому вы сможете определить, где он ищет текстуру, и поместить ее туда.

person BradleyDotNET    schedule 05.10.2015
comment
Хорошо, раньше я вообще не использовал файл текстуры. Это обязательно? В любом случае. Я создал такой же куб и применил к нему текстуру. Текстура определенно находится на правильном пути. Когда я создаю контент в конвейере, он возвращает ошибку, если он не находится на правильном пути. Таким образом, сборка контента прошла успешно, но она все еще полностью черная. Это действительно странно. Кроме того, похоже, что monogame не поддерживает файлы acii fbx, они должны быть бинарными. - person Voxed; 06.10.2015
comment
@ceoepts да, XNA поддерживает очень мало материалов. Вам нужно включить файлы текстур. Текстура тоже скомпилировалась в XNB? Вы включили его? - person BradleyDotNET; 06.10.2015
comment
Да, я включил все в конвейер моноигры. Я вижу все xnb внутри папки bin. Я действительно не знаю, что еще проверить :/ - person Voxed; 06.10.2015
comment
@ceoepts Вы также можете попробовать не устанавливать вручную текстуру для объекта Effect, но очень сложно сказать, что не так :( - person BradleyDotNET; 06.10.2015
comment
Ааа, я только что понял. Блендер, похоже, не экспортирует рабочий файл xna. Он говорит, что это происходит в реестре аддонов. Мне пришлось скачать конвертер fbx с сайта Autodesk и конвертировать его. Я также заметил, что вместо этого я мог бы использовать файлы dae. Знаете ли вы, есть ли минусы в их использовании? Во всяком случае, после того, как я преобразовал файл fbx, он отлично работает. Спасибо за помощь! - person Voxed; 06.10.2015
comment
@ceoepts Я обычно использую продукты Autodesk :) Инструмент Softimage Mod (если вы можете его получить) работает очень хорошо. Я не знаю ни плюсов, ни минусов DAE, но я им не пользовался. - person BradleyDotNET; 06.10.2015
comment
Я попробую 3ds max или maya, так как они включены в мой образовательный пакет, в любом случае, спасибо за помощь :) - person Voxed; 06.10.2015
comment
FBX поддерживает встроенные текстуры, но, конечно, экспортер и импортер должны это поддерживать. - person Koby Duck; 04.01.2018
comment
@KobyDuck Должно быть, тогда XNA не поддерживает импорт; потому что мне не повезло с этим в прошлом :) - person BradleyDotNET; 04.01.2018