Моделите изглеждат черни в 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
Ааа, току що разбрах. Blender изглежда не експортира работещ 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