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
|
Zaslal: 20. srpen 2008, 16:30:51 Předmět: |
|
|
Neni to tak hrozny, tohle tam ma pekne ve zvlastnim souboru/tride, jde to pekne videt... |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 20. srpen 2008, 16:39:24 Předmět: |
|
|
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 |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 20. srpen 2008, 19:55:51 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. srpen 2008, 21:27:23 Předmět: |
|
|
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 |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 20. srpen 2008, 21:50:37 Předmět: |
|
|
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... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. srpen 2008, 22:12:16 Předmět: |
|
|
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 |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 21. srpen 2008, 10:16:12 Předmět: |
|
|
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čí. |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 21. srpen 2008, 10:53:51 Předmět: |
|
|
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ý |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 21. srpen 2008, 10:58:42 Předmět: |
|
|
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 |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 21. srpen 2008, 11:12:02 Předmět: |
|
|
Jj. Všechno co jsi napsal, jsem si už nastudoval a pochopil... Díky |
|
Návrat nahoru |
|
|
|