|
|
|
|
|
|
Další informace
|
|
|
|
|
Poslední príspevky na fóru
|
|
|
|
|
Ads
|
|
|
|
|
|
|
|
|
|
|
|
|
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.

Click here to go to the forum on this chapter!
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/riemers/public_html/chz/Tutorials/XNA/Csharp/Series1/The_effect_file.php(9) : eval()'d code(35) : eval()'d code on line 292
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); } } }
- Website design & XNA + DirectX code : Riemer Grootjans - ©2003 - 2008 Riemer Grootjans
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2007 - 2008 MVP Award DirectX - XNA
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Podporte tuto stránku jakákoliv cástka je vítaná!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|