Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMartin Macháček
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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.