.[ ČeskéHry.cz ].
Bump mapping
Jdi na stránku Předchozí  1, 2
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 20. srpen 2008, 16:30:51    Předmět: Odpovědět s citátem

Neni to tak hrozny, tohle tam ma pekne ve zvlastnim souboru/tride, jde to pekne videt...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 20. srpen 2008, 16:39:24    Předmět: Odpovědět s citátem

Aha takže pro shadery se používá třída Effect? Zajímavý, že když sem to před časem googlil, tak my to nic nevyplivlo...

Teď už se mi konečne podařilo najít kompletní popis i s příkladem na MSDN, tak už snad dám do kupy nějakej pokus...

Ještě by mě zajímalo, co všechno musí obsahovat *.fx soubor s HLSL kódem, aby mi to nepadalo při načítání...? Řekněme, že bych chtěl vertex shader, kterej by jenom posunul vertex při každém vykreslení o kousek vedle, jak by takový kód v HLSL měl vypadat?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 20. srpen 2008, 19:55:51    Předmět: Odpovědět s citátem

Nakonec sem teda něco sesmolil, ale nefunguje to, protože pořád nějak nechápu jak se tý funkci v shaderu předají parametry (vertex in, vertex out). Navíc teda nechápu jak napsat funkci pro pixel shader, když chci ty pixely ponechat beze změny.

Takže shader:
kód:
//application to vertex structure
struct a2v
{
     float4 position : POSITION0;
};

//vertex to pixel shader structure
struct v2p
{
     float4 position : POSITION0;
};

//VERTEX SHADER
void vs( in a2v IN, out v2p OUT )
{
    OUT.position = IN.position * 0.5;
}

technique test
{
    pass p0
    {
        vertexshader = compile vs_1_1 vs();
        //pixelshader = compile ps_2_0 ps();
    }
}


A snad podstatný části kódu:
kód:

init:
            Console.WriteLine("Shader loading...");
            shader = Effect.FromFile(d3dDevice, "shader.fx", null, null, ShaderFlags.None, null);
                //(device, "shadercode.fx", null,  ShaderFlags.None, null);
            shader.Technique = "test";
            Console.WriteLine("Shader loaded");

            #warning modely vytvořit zde
            Console.WriteLine("Creating vertex buffer");
            VB = new VertexBuffer(typeof(CustomVertex.PositionColoredTextured),
                                                3, device,
                                                Usage.Dynamic | Usage.WriteOnly,
                                                CustomVertex.PositionColoredTextured.Format,
                                                Pool.Default);
            CustomVertex.PositionColoredTextured[] verts = new CustomVertex.PositionColoredTextured[3];
            verts[0].Position = new Vector3(-1, -1, 0);
            verts[0].Color = Color.Red.ToArgb();

            verts[1].Position = new Vector3(-1, 1, 0);
            verts[1].Color = Color.Green.ToArgb();

            verts[2].Position = new Vector3(1, 1, 0);
            verts[2].Color = Color.Blue.ToArgb();
            VB.SetData(verts, 0, LockFlags.None);

render:
            d3dDevice.SetStreamSource(0, VB, 0);

            int passes = shader.Begin(0);

            // Loop through all of the effect's passes.
            for (int i = 0; i < passes; i++)
            {
                // Set a shader constant
                //shader.SetValue("WorldMatrix", worldMatrix);

                // Set state for the current effect pass.
                shader.BeginPass(i);

                // Render some primitives.
               
                d3dDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

                // End the effect pass
                shader.EndPass();
            }

            // Must call Effect.End to signal the end of the technique.
            shader.End();


Výsledkem je vykreslenej barevnej trouhelník, ale neni ani zvětšenej ani se neroztahuje, ani neposouvá, nic... když to pustim v pixu, tak se dozvim že to funkce vertexshaderu volá, že sou souřadnice ve vertex bufferu po vertex procesu jiné než před vertexem, ale na výsledek to vliv nemá.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 20. srpen 2008, 21:27:23    Předmět: Odpovědět s citátem

Samotné použití shaderů vyžaduje znalost jistých principů, které jsou přítomny v grafické pipeline už desítky let, zkrátka je třeba znát grafiku. Parametry vertexů jsou součástí vertex bufferů. Pokud chceš něco posunout či rotovat, je třeba si do shaderu přidat nějakou transformační matici, pomocí které to budeš dělat, jako uniformní proměnnou, která je konstantní pro celý model. Nesmí se zapomenout ani na projekční matici, výstupní pozice z vertex shaderu musí být v clip-space. Po vykonání vertex shaderu to za tebe provede ořez toho, co nemá být vidět, dojde k interpolaci k hodnot mezi vertexy - tím se určí jejich hodnoty pro každý pixel a pustí se pixel shader. Jeho výstupem je jen barva pixelu a ty se musíš postarat o zbytek. Žádné ponechání pixelu "beze změny" neexistuje, ty definuješ program, který ty pixely počítá. Funkce tex2D bere sampler (objekt, která má přiřazenou texturu, filtrování a další nastavení) a texturové koordináty, které si musíš poslat na výstup z vertex shaderu a tak je dostat do pixel shaderu. Na daných koordinátech ti to vrátí barvu pixelu, jaká v té textuře je (případně filtrovaná atd.) a ty ji musíš poslušně poslat na výstup, aby se ti to pak zobrazilo.

Effect je víc než shader. Nevím, jaká je přesně jeho definice v D3D, protože v různých API to je trochu něco jinýho. Effect obecně obsahuje jeden nebo víc shaderu, nastavení samplerů a někdy i nastavení render state. Některé knihovny na effecty jdou dál a jsou schopny nastavit několik renderovacích průchodů nebo různé profily pro různý hw a k tomu odpovídající shadery, sampler states, render state a render target.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 20. srpen 2008, 21:50:37    Předmět: Odpovědět s citátem

Dám tomu ještě den, ale už mě z toho bolí hlava... přečetl sem o tom toho docela dost. Já bych prostě potřeboval jednoduchej příklad, kterej by třeba nedělal ve výsledku nic, ale aspoň aby byl funkčí a já jsem věděl jak to správně napsat. Teorie mi mlže bejt tisickrát k ničemu, když nevím jak to napsat... Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 20. srpen 2008, 22:12:16    Předmět: Odpovědět s citátem

Dobrý start je použít nějaký editor, třeba AMD RenderMonkey. Shadery jsem začal víc dělat až v tom. Je tam hodně příkladů a osvobozuje tě to od psaní vlastní aplikace, pokud si to chceš jenom vyzkoušet.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 21. srpen 2008, 10:16:12    Předmět: Odpovědět s citátem

Konečně sem to rozjel, stačilo nastavit d3dDevice.VertexDeclaration a pokud chci ponechat defaultní pixel shader, stačí napsat PixelShader = NULL; ... zase takový problém to nebyl, jenom sem prostě nevěděl že se tohle musí udělat. No sem rád že to frčí. Cool
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 21. srpen 2008, 10:53:51    Předmět: Odpovědět s citátem

Ohledně HLSL...
HLSL by měl obsahovat alespoň jeden efekt. Každý efekt pak obsahuje tzv. techniku a každá technika má několik průchodů (passes). Když se podíváš do nějakýho samplu, tak uvidíš, že používaní HLSL souboru vypadá většinou tak, že se nejprve nastaví parametry načteného HLSL souboru, inicializuje se efekt (Begin), pak se vybere technika efektu, která se bude používat, a nakonec se projdou postupně všechny průchody vybrané techniky a pro každou se vykreslí geometrie.
Prostě HLSL soubor se skládá z efektů, které se skládají v technik, které se skládají z průchodů.

V každém průchodu můžeš specifikovat nastavení všech render states. Důležité je, že mezi těmito render states figurují také VertexShader a PixelShader. To těch totiž můžeš také "přiřadit zdroják" - tedy někde vedle si nadefinovat funkci, kterou pak přiřadíš do této render states.

Kromě efektů a funkcí může HLSL soubor obsahovat globální proměnné, které lze používat při psaní shaderů a nastavování render states. Tyto globální proměnné mohou mít různé modifikátory, které určují např. to, jestli jsou viditelné zvenku (a tedy jestli je možné je modifikovat z programu). Právě pomocí těchto globálních proměnných většinou nastavuješ věci jako WVP matice, materiál apod.

Jinak se to chce fakt podívat na pár samplů, abys to pořádně pochopil...
O HLSL jsem psal také ve své diplomce: https://dip.felk.cvut.cz/browse/details.php?f=F3&d=K13136&y=2008&a=augusm1&t=dipl Ale není to zrovna část, na kterou bych byl dvakrát hrdý Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 21. srpen 2008, 10:58:42    Předmět: Odpovědět s citátem

Pokud nastavíš PixelShader na null, tak to imho znamená, že se pro pixelovou (post-rasterizační) část pipeline použíje fixed-function pipeline (tedy texturovací jednotky atd.).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 21. srpen 2008, 11:12:02    Předmět: Odpovědět s citátem

Jj. Všechno co jsi napsal, jsem si už nastudoval a pochopil... Díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna