XNA for C#
DirectX 9 for C#
DirectX 9 for C++
DirectX 9 for VB
Forum
   
My XNA Book
      
       Go to section on this site

Další informace


Poslední príspevky na fóru

 Account settings
  Posted by: Anonymous
  When: 07/05/2014 at 09:48:39

 forced subtitle
  Posted by: Applefly
  When: 07/05/2014 at 06:00:48

 convert DVD into PMS
  Posted by: Applefly
  When: 07/05/2014 at 05:55:25

 DVD to Digital Copy easily
  Posted by: VIKIVannessa
  When: 05/05/2014 at 06:52:29

 DVD on Xbox 360/Xbox One Console
  Posted by: VIKIVannessa
  When: 05/05/2014 at 06:51:47

 Extract .Srt Subtitles
  Posted by: Applefly
  When: 04/05/2014 at 03:54:38

 Encode Movie collection
  Posted by: Applefly
  When: 04/05/2014 at 03:52:41

 Convert DVD to WMV
  Posted by: Applefly
  When: 29/04/2014 at 05:53:50

 rip DVDs into digital files
  Posted by: Applefly
  When: 29/04/2014 at 05:51:20

 iTunes movies/music to Kindle Fire
  Posted by: ciciyu80
  When: 29/04/2014 at 05:10:20


Ads

Soubor Effect

Jedním z hlavních rozdílu mezi DirectX a XNA je potreba Effect pro všechno, co chceme vykreslit. Takže co je to vlastne ten Effect?

V 3D programování všechny objekty jsou zastoupeny jako trojúhelníky. Každá koule muže být zastoupena pomocí trojúhelníku, pokud jich použijeme dost. Effect je cást kódu, která nám rídí hardware (grafickou kartu), jak by mel zobrazit tyto trojúhelníky. Soubor effect obsahuje jednu z mnoha technik, pro príklad techniku A a techniku B. Vykreslení trojúhelníku technikou A bude napríklad vykreslení polopruhledné (semi-transparent) a vykreslení technikou B bude treba vykreslení v odstínech šedi, takže scéna bude mít nádech hororu.
Nebojte se, že by toho bylo príliš, protože je to pokrocilá látka, tak si více povíme až v Sérii 3. Nicméne, XNA potrebuje soubor effect k vykreslení každého i nejjednoduššího trojúhelníku, takže jsem napsal soubor effect, který obsahuje nekteré velice základní techniky. Mužete ho stáhnout zde (link – zde). Kliknete pravým tlacítkem na odkaz a vyberte „Uložit jako…“. Meli byste uložit soubor do stejné složky, kde máte zdrojové kódy vašeho projektu. Pokud nevíte, kde to je, tak se nejdríve vratte ke svému kódu a kliknete na File menu a vyberte „Save [jméno projektu] as …“. Jako defaultní nastavení by se meli vaše zdrojové kódy ukládat do „C:\Documents and Settings\[vaše jméno]\My Documents\Visual Studio 2005\Projects\[jméno projektu]\[jméno projektu].

Ted, když máte stažený soubor effect ve stejné složce jako jsou vaše zdrojové kódy, odkážeme náš program na tento soubor. Deklarujeme nový Effect objekt, takže vložte tento kód na zacátek vaší trídy:

 Effect effect;

Ted bežte zpátky do metody SetUpXNADevice a pridejte tyto rádky kódu:

 CompiledEffect compiledEffect = Effect.CompileEffectFromFile("@/../../../../effects.fx", null, null, CompilerOptions.None, TargetPlatform.Windows);
 effect = new Effect(graphics.GraphicsDevice, compiledEffect.GetEffectCode(), CompilerOptions.None, null);

Vypadá to možná složite, ale všechno co tento kód delá je, že jen nacítá soubor effect. První rádek nacte HLSL kód ze souboru effect.fx a zpracuje ho do assemblu (jazyku grafických karet). @../../../../ Musí být nazacátku názvu, protože program je spušten z .exe souboru, který je v /bin/x86/debug/, takže potrebujeme se dostat zpet o nekolik složek. Další argumenty tohoto rádku jsou mimo rozsah této série, ale budou vysvetleny ve 3. sérii. Druhý rádek nacte zpracovaný kód do naší promenné effect, která je ted pripravena k použití.

Se všemi potrebnými a nactenými promennými se mužeme zamerit na metodu Draw. Zacneme s prvním rádkem graphics.GraphicsDevice. Mužeme ho nahradit zkratkou „device“, kterou jsme vytvorili v predchozí cásti.

První rádek vycistí buffer našeho okna na specifickou barvu. Nastavíme si tmavou modrou, jenom pro zábavu:

 device.Clear(Color.DarkSlateBlue);

Místo prímého vykreslování do okna se v XNA používá buffer. Obsah bufferu je vykreslen na obrazovku pouze jednou. Tímto se zamezí blikáním obrazovky, když se bude vykreslovat každá cást scény oddelene.

Spuštením tohoto kódu už vám vytvorí obrázek, který mužete videt níže, ale rád bych pridal ješte další kód. Jak jsem napsal výše, k vykreslení neceho potrebujeme nejdríve specifikovat techniku ze souboru effect. Takže vložte tento kód za volání metody Clear:

 effect.CurrentTechnique = effect.Techniques["Pretransformed"];
 effect.Begin();

Mužete videt, že jsme vybrali techniku Pretransformed, o které se neco naucíme v dalším dílu. Potom si také rekneme jak zacít s effect.

Techniku mužeme využít nekolikrát, takže potrebujeme vytvorit cyklus, kde budeme vkládat potrebné objekty k vykreslení. Pridáním tohoto kódu zarídíme vše potrebné:

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

Mezi volání Begin a End vždy pridáme objekty, které budou potreba vykreslit urcenou technikou.. Scéna musí být vykreslena mezi temito 2 voláními. Na konci potrebujeme vložit ješte jedno volání. Toto voláním nám rekne, že už není potreba žádný objekt k vykreslení použitou technikou.

Konecne mužeme prejít k inicializacní cásti. Pokud nerozumíte všemu o efektech a technikách nemusíte se bát, protože o podrobnostech se budeme bavit v Sérii 3. Se všemi cástmi kódu správne nastavenými, se mužeme konecne vrhnout na vykreslování vecí na obrazovku, kterými se budeme zabývat v další cásti.




DirectX Tutorial 2 - Soubor Effect

If you appreciate the amount of time I spend creating and updating
these pages, feel free to donate -- any amount is welcome !



Click here to go to the forum on this chapter!


Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home1/riemers/public_html/chz/Tutorials/XNA/Csharp/Series1/The_effect_file.php(9) : eval()'d code(35) : eval()'d code on line 303


Our code so far:

 
 #region Using Statements
 using System;
 using System.Collections.Generic;
 using Microsoft.Xna.Framework;
 using Microsoft.Xna.Framework.Audio;
 using Microsoft.Xna.Framework.Content;
 using Microsoft.Xna.Framework.Graphics;
 using Microsoft.Xna.Framework.Input;
 using Microsoft.Xna.Framework.Storage;
 #endregion
 
 namespace XNAtutorial
 {
     public class Game1 : Microsoft.Xna.Framework.Game
     {
         GraphicsDeviceManager graphics;
         ContentManager content;
         GraphicsDevice device;
         Effect effect;
 
         public Game1()
         {
             graphics = new GraphicsDeviceManager(this);
             content = new ContentManager(Services);
         }
 
         protected override void Initialize()
         {
             base.Initialize();
             SetUpXNADevice();
         }
 
         private void SetUpXNADevice()
         {
             device = graphics.GraphicsDevice;
 
             graphics.PreferredBackBufferWidth = 500;
             graphics.PreferredBackBufferHeight = 500;
             graphics.IsFullScreen = false;
             graphics.ApplyChanges();
             Window.Title = "Riemer's XNA Tutorials -- Series 1";
 
             CompiledEffect compiledEffect = Effect.CompileEffectFromFile("@/../../../../effects.fx", null, null, CompilerOptions.None, TargetPlatform.Windows);
             effect = new Effect(graphics.GraphicsDevice, compiledEffect.GetEffectCode(), CompilerOptions.None, null);
         }
         
         protected override void LoadGraphicsContent(bool loadAllContent)
         {
             if (loadAllContent)
             {        
             }
         }
 
         protected override void UnloadGraphicsContent(bool unloadAllContent)
         {
             if (unloadAllContent == true)
             {
                 content.Unload();
             }
         }
 
         protected override void Update(GameTime gameTime)
         {
             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                 this.Exit();
             base.Update(gameTime);
         }
 
         protected override void Draw(GameTime gameTime)
         {
             device.Clear(Color.DarkSlateBlue);
 
             effect.CurrentTechnique = effect.Techniques["Pretransformed"];
             effect.Begin();
             foreach (EffectPass pass in effect.CurrentTechnique.Passes)
             {
                 pass.Begin();
 
                 pass.End();
             }
             effect.End();
 
             base.Draw(gameTime);
         }
     }
 }


Google
 
Webwww.riemers.net


If you appreciate the amount of time I spend creating and updating
these pages, feel free to donate -- any amount is welcome !



- Website design & XNA + DirectX code : Riemer Grootjans -
©2003 - 2011 Riemer Grootjans
Translations

This site in English
This site in Korean
This site in Czech

Microsoft MVP Award



2007 - 2011 MVP Award
DirectX - XNA

Contents

Tutoriály
XNA používající C#
Series 1: Terrain
Začátek projektu
Soubor Effect
Vykreslení prvního trojúhelníku
-- Expand all --


Thank you!

Podporte tuto stránku
jakákoliv cástka je vítaná!

Zustante informováni

I don't have the time to keep a News section, so stay informed about the updates by clicking on this RSS file!