Autor Wątek: Problem z wyświetlaniem modelu w XNA 4  (Przeczytany 5276 razy)

Offline voytech

  • Użytkownik

# Kwiecień 25, 2013, 02:55:12
Macie jakieś pomysły?

efekt był do przewidzenia, niebieskie obwódki to poprzedni efekt alfa blendingu z nieposortowanymi trójkątami. Poprostu prześwituje niebieskie tło. Jak tło będzie zielone to obwódki będziesz miał zielone.

Spróbuj zwiększać wartość "ReferenceAlpha" aż obwódki znikną. Oczywiście mogą się pojawić inne efekty uboczne.

Spróbuj też wyłączyć blending i zostawić tylko alfa testing

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline VillageRaper

  • Użytkownik

# Kwiecień 25, 2013, 17:42:12
Wyłączyłem alphablending i niebieskie tło za przezroczystością zniknęło, a postrzępione teoretycznie niewidoczne fragmenty nabrały wyglądu tekstury.
Następnie ustawiłem ReferenceAlpha tak jak mi zasugerowałeś.

Wynik dla wartości ReferenceAlpha = 80
http://imageshack.us/a/img853/7798/postep2a.jpg

Wynik dla wartości ReferenceAlpha = 100
http://imageshack.us/a/img153/2966/postep2b.jpg
« Ostatnia zmiana: Kwiecień 25, 2013, 18:02:37 wysłana przez VillageRaper »

Offline voytech

  • Użytkownik

# Kwiecień 26, 2013, 08:58:18
Wygląda zadowalająco, oprócz tej przedniej szyby. Próg ustawiony na 100 usunął całkowicie teksturę szyby, dlatego dobrze by było żebyś model rysował w dwóch przebiegach:
1. włączony jedynie alfa test, próg 80-100?, rendering samochodu bez szyby
2. włączony jedynie blending, rendering samej szyby

Offline VillageRaper

  • Użytkownik

# Kwiecień 30, 2013, 21:53:00
Zrobiłem tak jak mi teraz podpowiedziałeś.

Aktualny kod:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Aplikacja3D2
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Model model;
        Vector3 modelPosition = Vector3.Zero;
        Vector3 cameraPosition = new Vector3(500f, 250.0f, -350.0f);
        float modelRotation = 0.0f;
        float aspectRatio;
        MouseState state;
        int fullscreen = 1;
        int windowed = 0;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();

            spriteBatch = new SpriteBatch(GraphicsDevice);
            model = Content.Load<Model>("Models\\fiat");
            graphics.PreferredBackBufferWidth = GraphicsDevice.DisplayMode.Width;
            graphics.PreferredBackBufferHeight = GraphicsDevice.DisplayMode.Height;
            graphics.PreferMultiSampling = true;
            graphics.IsFullScreen = true;
            graphics.ApplyChanges();
            aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
            Window.Title = "Aplikacja 3D";

           
        }
        protected override void LoadContent()
        {
           
        }
        protected override void UnloadContent()
        {
        }
        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();
            if (Mouse.GetState().ScrollWheelValue > state.ScrollWheelValue)
            {
                cameraPosition += new Vector3(0.0f, -5.0f, 0.0f);
            }
            if (Mouse.GetState().ScrollWheelValue < state.ScrollWheelValue)
            {
                cameraPosition += new Vector3(0.0f, 5.0f, 0.0f);
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Left))
                this.cameraPosition += new Vector3(0.0f, 0.0f, 5.0f);
            if (Keyboard.GetState().IsKeyDown(Keys.Right))
                this.cameraPosition += new Vector3(0.0f, 0.0f, -5.0f);
            if (Keyboard.GetState().IsKeyDown(Keys.Down))
                this.cameraPosition += new Vector3(5.0f, 0.0f, 0.0f);
            if (Keyboard.GetState().IsKeyDown(Keys.Up))
                this.cameraPosition += new Vector3(-5.0f, 0.0f, 0.0f);

            if ((Keyboard.GetState().IsKeyDown(Keys.W)) && (windowed == 0))
            {
                this.graphics.IsFullScreen = false;
                this.graphics.PreferredBackBufferWidth = 800;
                this.graphics.PreferredBackBufferHeight = 600;
                this.graphics.ApplyChanges();
                aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
                fullscreen = 0;
                windowed = 1;
            }
            if ((Keyboard.GetState().IsKeyDown(Keys.F)) && (fullscreen == 0))
            {
                this.graphics.IsFullScreen = true;
                this.graphics.PreferredBackBufferWidth = GraphicsDevice.DisplayMode.Width;
                this.graphics.PreferredBackBufferHeight = GraphicsDevice.DisplayMode.Height;
                this.graphics.ApplyChanges();
                aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
                fullscreen = 1;
                windowed = 0;
            }

            GraphicsDevice.Clear(Color.CornflowerBlue);
            GraphicsDevice.DepthStencilState = DepthStencilState.Default;
           

            Matrix[] transforms = new Matrix[model.Bones.Count];
            model.CopyAbsoluteBoneTransformsTo(transforms);

            foreach (ModelMesh mesh in model.Meshes)
            {
                if (mesh.Name != "glass")
                {
                    foreach (AlphaTestEffect effect in mesh.Effects)
                    {
                        effect.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
                        effect.DiffuseColor = new Vector3(1.0f, 1.0f, 1.0f);
                        effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelRotation) * Matrix.CreateTranslation(modelPosition);
                        effect.View = Matrix.CreateLookAt(cameraPosition, modelPosition, Vector3.Up);
                        effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
                        effect.ReferenceAlpha = 80;
                    }

                }
                if (mesh.Name == "glass")
                {
                    foreach (AlphaTestEffect effect in mesh.Effects)
                    {
                        effect.GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
                        effect.DiffuseColor = new Vector3(1.0f, 1.0f, 1.0f);
                        effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelRotation) * Matrix.CreateTranslation(modelPosition);
                        effect.View = Matrix.CreateLookAt(cameraPosition, modelPosition, Vector3.Up);
                        effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
                        effect.ReferenceAlpha = 0;
                    }
                }
               

               

                           mesh.Draw();
            }

            state = Mouse.GetState();
            base.Update(gameTime);
        }
    }
}

Efekt:


Update #1 (01.05.2013)
Coś mi się wydaję, że chyba trochę skwasiłem.
« Ostatnia zmiana: Maj 01, 2013, 15:57:16 wysłana przez VillageRaper »