Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Počítačové hry a animace Cvičení 7. Notová osnova Shadery – –Phong – –Toon – –Edge detection Hierarchie – –Kostra Animace – –Rigid – –Skinning – –Blending.

Podobné prezentace


Prezentace na téma: "Počítačové hry a animace Cvičení 7. Notová osnova Shadery – –Phong – –Toon – –Edge detection Hierarchie – –Kostra Animace – –Rigid – –Skinning – –Blending."— Transkript prezentace:

1 Počítačové hry a animace Cvičení 7

2 Notová osnova Shadery – –Phong – –Toon – –Edge detection Hierarchie – –Kostra Animace – –Rigid – –Skinning – –Blending – –Per-vertex (2)

3 (3) Programovatelná pipeline

4 (4) Vertex a pixel(fragment) shader Vertex shader – –Transformace normál/vrcholů – –Výpočet texturovacích souřadnic – –Nemá informace o primitivu – –Nemůže rušit ani přidávat vrcholy Pixel shader – –Výstup VS je interpolován a poslán na vstup PS – –Výpočet finální barvy fragmentu (pixelu) – –Může měnit hloubku fragmentu – –Může fragment zahodit – –Nemůže měnit jeho souřadnice

5 (5) Anatomie HLSL Zakladni typy – –int, float, bool … Vektory, barvy – –float3, float4 = float4(1,0,0,1) Matice – –floatRxC – –Float4x4 – 4x4 matice Structs – –struct myStruct { – –float4 position; – –… – –} Matematické fce – –mul, pow, normalize, dot, cross,... OUT VS( float4 Pos: POSITION, float3 N: NORMAL ) float4 PS( float3 L: TEXCOORD0, float3 N: TEXCOORD1 ) : COLOR technique DiffuseLight { pass P0 { VertexShader = compile vs_1_1 VS(); PixelShader = compile ps_2_0 PS(); }

6 (6) Přenos dat z/do HLSL shaderu Globální proměnné – –Stejné pro celý model/část modelu – –HLSL: float4x4 World; – –XNA: Effect.Parameters[“World”].SetValue(Matrix.Identity); vertex/fragment proměnné – –POSITION, TEXCOORD0, NORMAL, COLOR0 – –Specifikace HLSL – –Např. POSITION: pozice aktuálně zpracovávaného vertexu COLOR: výsledná barva aktuálního fragmentu

7 (7) Použití XNA Effect Nahrát shader přes Content – –Content.Load (“EffectAssetName”); Zvolit techniku z shaderu – –Pokud je jenom jedna, tak není nutné – –Effect.CurrentTechnique = effect.Techniques[“technique name”] Nastavit globální proměnné – –Effect.Parameters[“World”].SetValue(Matrix.Identity); Vykreslit (XNA 4.0) foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply();... Draw geometry … }

8 (8) Shader 1+2: Phong

9 (9) Shader 1: Ambient + Diffuse RenderDiffuse() Code1: DiffuseShader.fx – –VS( float4 Pos: POSITION, float3 N: NORMAL ) – –PS_DIFFUSE(float3 L: TEXCOORD0, float3 N: TEXCOORD1) – –Hotový ambient Ka * Ia – –Přidat diffuse pomoci upravy fce getDiffuse a PS_DIFFUSE Kd * Id * dot(L,N) Pro tento případ Kd = 0.8

10 (10) Shader 2: Specular + Textura RenderTexturedSpecular() SpecularShader.fx Data z textury – –definice texture ColorMap; Sampler ColorMapSampler = sampler_state { } – –získání dat tex2D(sampler,coords)

11 (11) Shader 2: Specular + Textura Code2: Přidat do shaderu barvu z textury α – záleží na materiálu, zkuste např 20,5,1... tex2D(sampler,coords) = barva z textury – –Sampler je ColorMapSampler – –Texturovaci koordinaty jsou ulozeny v parametru predanem TEXCOORD3 kanalem Nahraďte barvou textury difuzní barvu, ktera je definovaná natvrdo

12 (12) Shader 3: Toon shader Code3: RenderToon() – –Přemapovat barvu do rozsahů textury (Toon.bmp) ToonShader.fx – –Podle barvy vybrat texel z textury CelMap Použijte funkci getGray pro přemapování 3D barvy do 1D grayscale Saturate omezí vstupní hodnotu na 0 až 1 – –Vrátit tuto hodnotu z pixel shaderu přenásobenou difůzní barvou materiálu

13 Shader 3: Toon shader Rešení – –Tex.y = 0.0f; – –Tex.x = saturate(getGray(Color)); – –float4 Remapped = tex2D(CelMapSampler, Tex) * DiffuseColor; – –return Remapped; (13)

14 (14) Shader 4: Edge detection filter RenderEdge() – –SetRenderTarget – výstup toon shaderu místo do framebufferu uložíme do textury RenderTarget2D renderTarget1 – vytvořen v LoadContent – –Vykreslíme znovu jako sprite a zpracujeme filtrem, který v obrázku vyhledá a označí hrany EdgeShader.fx – –getScharr(sampler,float2) vrátí 1 pokud je pixel součástí hrany, vrátí jedna pokud není Scharr filter

15 (15) Shader 4: Edge detection filter Code4: edge detection jen pro „vnější“ hrany objektu – –Uložit do textury obrázek vykreslený toon shaderem a zároveň jen ambientí barvu – –Na ambientní texturu aplikovat edge detection – –Sečíst s toon shaded texturou Jak na to – –Multiple render target = pixel shader může ukládat výstup do více bufferu najednou – –Jedním průchodem tedy můžeme spočítat jak toon shaded hodnotu tak si do druhé textury uložit ambientí barvu XNA: SetRenderTarget(1, renderTarget2); HLSL: ToonShader.fx: PixelShaderMRT návratová hodnota – –Pro edge detection Jednu texturu vykreslit přes spriteBatch Druhou přidat jako Sampler

16 Notová osnova Shadery – –Phong – –Toon – –Edge detection Hierarchie – –Kostra Animace – –Rigid – –Skinning – –Blending – –Per-vertex (16)

17 (17) Hierarchie Hierarchie objektu – –Uzel je transformace – –List je objekt Finální transformace objektu – –Tf = T0*T1*T2*…*Tn*Tlocal SceneGraph

18 (18) Hierarchie kostry Hierarchie kloubů V uzlech jsou transformace (rotace) kloubů Objekty jsou kosti

19 (19) Model pro skeletální animaci Musí mít kostru Povrch je hierarchií navázan na kostru Bez skinningu (základ) – –Každý mesh je navázaný na právě jednu kost – –Vertex každého meshe je ovlivněn právě jednou kostí Se skinningem (pokročilé) – –Vertex každého meshe může býto ovlivněn více kostmi s různou váhou

20 (20) Vykreslovací kód v XNA foreach (ModelMesh mesh in tankModel.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.World = boneTransforms[mesh.ParentBone.Index]; effect.View = view; effect.Projection = projection; effect.EnableDefaultLighting(); } mesh.Draw(); }

21 (21) Code 1: XNA Animation Sample http://create.msdn.com/en-US/education/catalog/ sample/simple_animation

22 (22) Skinning Každý vertex je ovlivněn více kostmi s určitou váhou – –Reálnější a hladší animace – –Časově náročné nastavení kostí a jejich vah v 3D editoru Váha, indexy kostí a jejich transformace jsou uloženy v tzv. vertex kanálu – –Předá se společné s ostatními daty o modelu pro GFX Posun vertexů proběhne na grafické kartě ve vertex shaderu

23 (23) Skinning v Maye Skin Weight Tool – –Kreslit black/white váhovou mapu

24 (24) Vertex format Data specifická pro každý vertex HLSL – –POSITION0,TEXCOORD0, BLENDWEIGHT0,,... XNA: VertexDeclaration, VertexBuffer, VertexElement – –VertexElementUsage.Position,TextureCoordinate,BlendWeights,... Vykreslení device.VertexDeclaration = vertexDeclaration; device.Vertices[0].SetSource(vertexBuffer, 0, MyOwnVertexFormat.SizeInBytes); device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

25 (25) Code 2: Skinning sample http://create.msdn.com/en-US/education/catalog/sample/skinned_model WEB: BASE2

26 (26) Skinning Vertex Shader VS_OUTPUT VertexShader(VS_INPUT input) { VS_OUTPUT output; // Blend between the weighted bone matrices. float4x4 skinTransform = 0; skinTransform += Bones[input.BoneIndices.x] * input.BoneWeights.x; skinTransform += Bones[input.BoneIndices.y] * input.BoneWeights.y; skinTransform += Bones[input.BoneIndices.z] * input.BoneWeights.z; skinTransform += Bones[input.BoneIndices.w] * input.BoneWeights.w; // Skin the vertex position. float4 position = mul(input.Position, skinTransform); output.Position = mul(mul(position, View), Projection); // Skin the vertex normal, then compute lighting. float3 normal = normalize(mul(input.Normal, skinTransform)); float3 light1 = max(dot(normal, Light1Direction), 0) * Light1Color; float3 light2 = max(dot(normal, Light2Direction), 0) * Light2Color; output.Lighting = light1 + light2 + AmbientColor; output.TexCoord = input.TexCoord; return output; }

27 (27) Blending animací Plynulý přechod z jedné animace do druhé Suma transformací s váhami Na úrovni transformace kostí Skeletální profily – –Seznam vah pro každou kost – –Možnost rozdělit animaci na části a aplikovat je separátně Blending např. běhu (nohy) a střílení (torzo a ruce)

28 (28) Per-vertex animace Bez kostry Každý keyframe ma pozice všech vertexů Vertex morph – –Interpolace mezi keyframy Vhodné na animaci látky a výrazu tváře – –Prakticky nemožné pomocí kostí

29 (29) V praxi Několik úrovní abstrakce – –Mesh – –Skeleton – –Animace – –Kontroler animace – –Konkrétní stav animace – –Mixer animací Kontroler → update transformací skeletonu podle keyframu animace Stav animace → výstup kontroleru Mixer → blending stavu animace

30 (30) SkinnedModel.fx Vyzkoušejte si: – –Vizuálně zobrazit jednotlivé váhy output.Lighting = input.BoneWeights.xxxx output.Lighting = input.BoneWeights.wzyx atd.. V pixel shaderu vypněte texturu – –Vliv jednotlivých kostí output.Lighting = input.BoneIndices / 59 – –Vypnout vliv některých kostí Zakomentovat jejich přičtení ke skinTransform

31 (31) Links http://xnanimation.codeplex.com/ – –XNAnimation + samples


Stáhnout ppt "Počítačové hry a animace Cvičení 7. Notová osnova Shadery – –Phong – –Toon – –Edge detection Hierarchie – –Kostra Animace – –Rigid – –Skinning – –Blending."

Podobné prezentace


Reklamy Google