Παρασκευή 24 Δεκεμβρίου 2010

ΧΝΑ - Ετοιμάζοντας το αρχείο effect

Μάθημα 3ο

  • Τα πάντα στον προγραμματισμό 3d αποτελούνται από τρίγωνα. Ακόμα και οι σφαίρες χρησιμοποιούν στην πραγματικότητα πολλά πολλά τρίγωνα. Ένα effect αρχείο λέει στην κάρτα γραφικών πως να δημιουργήσει αυτά τα τρίγωνα. Μια κύρια διαφορά του XNA με το DirectX είναι ότι στο XNA χρειαζόμαστε αρχεία effect για ότι σχεδιάζουμε στην οθόνη.


  • Που θα βρούμε όμως ένα τέτοιο αρχείο? Δυστυχώς είναι πολύ δύσκολο προς το παρόν να γράψουμε τέτοια αρχεία, διότι είναι σε μια γλώσσα πολύ πιο περίπλοκη από την C#. Όμως ευτυχώς κυκλοφορούν πάρα πολλά τέτοια αρχεία στο ίντερνετ. Μπορείτε να βρείτε ένα effect αρχείο [εδώ]!

    Το αρχείο αυτό πρέπει να αποθηκευτεί μαζί με τα αρχεία κώδικα. Για να εισαχθεί όμως σωστά, πατάμε δεξί κλικ στο Content -> Add -> Existing Item. Βρίσκουμε το αρχείο και πατάμε Add. Το αρχείο είναι έτοιμο για χρήση!


    Για να έχουμε πρόσβαση στο αρχείο αυτό, ξεκινάμε δηλώνοντας μια μεταβλητή Effect στην αρχή της κλάσης μας:
    Effect myEffect;

    Για να χρησιμοποιήσουμε το αρχείο γράφουμε στην αρχή της LoadContent μεθόδου:
    myEffect = Content.Load("effects");

    το "effects" είναι το όνομα του αρχείο χωρίς το .fx

To ήξερες? : Το ΧΝΑ χρησιμοποιεί ένα buffer για να σχεδιάσει στην οθόνη.
base.Draw(gameTime);
Αυτή η μέθοδος σχεδιάζει στην οθόνη ότι υπάρχει στο buffer μονομιάς. Έτσι δεν υπάρχει τρεμόπαιγμα καθώς σχεδιάζονται τα διάφορα στοιχεία.

  • Πάμε στην μέθοδο Draw
    GraphicsDevice.Clear(Color.CornflowerBlue);

    Επειδή έχουμε ήδη ορίσει το Gdevice αντικαθιστούμε τον παραπάνω κώδικα με
    Gdevice.Clear(Color.CornflowerBlue);

    Το ήξερες? : Μπορούμε να ανατρέξουμε στην λίστα που εμφανίζεται μετά το πάτημα του "." στο "Color." ώστε να βρούμε τι χρώμα θέλουμε να γεμίσει την οθόνη μας.


  • Θέλουμε να σχεδιάσουμε κάτι στην οθόνη, όμως πρώτα πρέπει να επιλέξουμε τον τρόπο που θα εμφανιστεί. Το επιτυγχάνουμε με τον παρακάτω κώδικα, τον οποίο βάζουμε μετά την κλήση της Clear από την Gdevice , στην αρχή της μεθόδου Draw:
    myEffect.CurrentTechnique = myEffect.Techniques("Pretransformed");

    Τώρα που ορίσαμε την τεχνική μας πρέπει να ξεκινήσουμε να την χρησιμοποιούμε:
    myEffect.Begin();

    Όμως μια τεχνική μπορεί να απαρτίζεται από πολλά passes οπότε κάλουμε Begin() και End() και για καθεμιά τους:

    foreach (EffectPass pass in myEffect.CurrentTechnique.Passes) 
    { 
    pass.Begin();  

    pass.End();

    myEffect.End();

    Ότι θα σχεδιάσουμε λοιπόν, μπαίνει ανάμεσα στο pass.Begin() και το pass.End(). Τέλος λέμε στην κάρτα γραφικών ότι δεν θα χρησιμοποιήσουμε την τεχνική για να ζωγραφίσουμε άλλα αντικείμενα - myEffect.End().


  • Μάθαμε πως να ετοιμάζουμε το αρχείο effect. Καλό είναι να έχουμε ένα τέτοιο αρχείο πρόχειρο, ώστε να το χρησιμοποιούμε στα πρώτα μας project.
Το 3ο μάθημα έφτασε στο τέλος του.

Ασχολίες για εξάσκηση:
  1. Προσπαθήστε να κάνετε την εισαγωγή του αρχείου effect από την αρχή.
  2. Δοκιμάστε να γράψετε τον κώδικα για την χρήση του αρχείου effect από την μνήμη σας
  3. Φρεσκάρετε την γνώση σας πάνω στην foreach , η οποία κάνει μια επανάληψη στα αρχεία μιας λίστας

Πηγές: Riemer's Tutorial

_________________________________________

Απλοποιημένος κώδικας (χωρίς περιττά σχόλια)



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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace SandboxGame
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        GraphicsDevice Gdevice;

        Effect myEffect;

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

        // Init
        protected override void Initialize()
        {
            graphics.PreferredBackBufferHeight = 600;
            graphics.PreferredBackBufferWidth = 800;
            graphics.IsFullScreen = false;
            graphics.ApplyChanges();
            Window.Title = "Το αλμυρό φυστίκι";

            base.Initialize();
        }

        // Load Content
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            Gdevice = graphics.GraphicsDevice;
            myEffect = Content.Load("effects");
        }

        protected override void UnloadContent()
        {

        }

        // Update (60 times per second)
        protected override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }

        // Draw
        protected override void Draw(GameTime gameTime)
        {
            Gdevice.Clear(Color.CornflowerBlue);

            myEffect.CurrentTechnique = myEffect.Techniques["Pretransformed"];

            myEffect.Begin();

            foreach (EffectPass pass in myEffect.CurrentTechnique.Passes)
            {
                pass.Begin();
                pass.End();
            }
            myEffect.End();

            base.Draw(gameTime);
        }
    }
}

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου