1 / 36

Számítógépes grafika

Számítógépes grafika. DirectX 4. gyakorlat. Emlékeztető. Eddig megismerkedtünk a keretrendszerünkkel Készítettünk alap geometriákat Használtunk transzformációkat. Tartalom. CG effektek Input kezelés. C for Graphics. NVIDIA fejlesztette a 2000-es évek elején (MS-sel)

Download Presentation

Számítógépes grafika

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Számítógépes grafika DirectX 4. gyakorlat

  2. Emlékeztető • Eddig megismerkedtünk a keretrendszerünkkel • Készítettünk alap geometriákat • Használtunk transzformációkat

  3. Tartalom • CG effektek • Input kezelés

  4. C forGraphics • NVIDIA fejlesztette a 2000-es évek elején (MS-sel) • C-n alapuló, magas szintű nyelv a grafikus hardver programozására • A CG fordító HLSL (DX) • vagy GLSL (OpenGL) • kódot generál

  5. C forGraphics • A CG segítségével a GPU-t tudjuk programozni • A gyakorlatokon vertex és fragmentshadereket írunk • A vertex feldolgozó a „nyers” geometriát transzformálja NPKR-be • A fragmentshader az egyes fragment-ek (pixel nagyságú felületdarabok) színét számolja ki

  6. C for Graphics adattípusok • Szokásos alap adattípusok: • float: 32 bites lebegőpontos szám • int: 32 bites egész szám • bool: boolean • További alap adattípusok: • half: 16 bites lebegőpontos szám • fixed: 12 bites fixpontos szám • sampler: textúra mintavételező

  7. C for Graphics adattípusok • Egyéb alap adattípusok: • float4: 1 dimenziós float vektor (float3, ...) • float4x4: 4x4-es float mátrix

  8. C for Graphics műveletek • Vektorműveletek • dot, cross stb. • Egyéb: • lerp(a, b, w): lineáris interpoláció

  9. CgFX • Egy effekt fájl valamilyen vizuális effektust (bumpmapping, environment map stb.) valósít meg • Maga a CgFX egy text forrásfájl • A vertex és fragmentshader is benne található meg • Továbbá állapotváltozók módosíthatóak (z-puffer írás engedélyezése, átlátszóság stb.)

  10. CgFX • Egy CgFX fájl a megvalósítandó effektust többféleképpen is implementálhatja • Ezeket hívják technikáknak (technique), amelyek tipikusan más-más szintű hardvert igényelnek: • techniquePixelShaderVersion{...}techniqueLowDetailVersion {...}

  11. CgFX • Minden technika több lépésből, pass-ból állhat • Minden passrenderelési állapotokból és shaderekből áll: • passfirstPass { DepthWriteEnable= true; AlphaBlendEnable= false; MinFilter[ 0 ] = Linear; MagFilter[ 0 ] = Linear; MipFilter[ 0 ] = Linear; PixelShader= …

  12. CgFX • Technikára vagy egész effektre globális változói is lehetnek • Ezekhez szemantika is rendelhető: • float4x4myViewMatrix : ViewMatrix; • texture2DsomeTexture : DiffuseMap;

  13. Első CgFX-es program • Maga a keretrendszer: http://cg.elte.hu/~valasek/keretek/DX_Template.zip

  14. DXMyApp.h private: CGcontext m_CGcontext; CGeffect m_CGeffect; CGtechniquem_CGtechnique; CGparameter m_CGparam_world; CGparameter m_CGparam_view; CGparameter m_CGparam_proj;

  15. DXMyApp.h • CGcontext: a contexta CG programok tárolója – mindet hozzá kell rendelni egy contexthez • CGeffect: az effekt-fájljainkat ilyen típusú változókhoz fogjuk hozzárendelni • CGtechnique: az effekt-fájljainkban található technikák azonosítására szükséges az alkalmazásból

  16. DXMyApp.h • CGparameter: • az effekt fájlunkban lévő globális változókhoz biztosítanak elérést ezek a változók • Megfelelő CG-s függvényekkel a CGparameter-ben tárolt azonosító segítségével értékek tudunk adni a shaderes változóinknak az alkalmazásunkból

  17. CDXMyApp::CDXMyApp() CDXMyApp::CDXMyApp(void) { m_pVB = 0; m_CGcontext = 0; m_CGeffect = 0; m_CGtechnique = 0; m_CGparam_world = 0; m_CGparam_proj = 0; m_CGparam_view = 0; }

  18. CDXMyApp::InitD3D() HRESULTCDXMyApp::InitD3D() { m_CGcontext= cgCreateContext(); cgD3D9RegisterStates(m_CGcontext); m_CGeffect =cgCreateEffectFromFile( m_CGcontext, "myFX.cgfx", NULL ); m_CGtechnique= cgGetFirstTechnique( m_CGeffect);

  19. CDXMyApp::InitD3D() • CGcontextcgCreateContext() • Ezzel hozunk létre egy context-et • A CG kezeli

  20. CDXMyApp::InitD3D() • void cgD3D9RegisterStates( CGcontextcontext) • Az effekt fájlokban található D3D9 állapotváltozó értékadások érvényesítése

  21. CDXMyApp::InitD3D() • CGeffectcgCreateEffectFromFile( CGcontextcontext, constchar * filename, constchar ** args); • A context-tel azonosított context-be betölti a filename-ben található effekt fájlt, args fordítási argumentumokkal

  22. CDXMyApp::InitD3D() • CGtechniquecgGetFirstTechnique( CGeffecteffect) • Az effect-ben található első technika azonosítóját adja vissza

  23. CDXMyApp::InitD3D() cgGetNamedEffectParameter( m_CGeffect, ""); m_CGparam_world = cgGetNamedEffectParameter( m_CGeffect, "model" ); m_CGparam_view = cgGetNamedEffectParameter( m_CGeffect, "view" ); m_CGparam_proj = cgGetNamedEffectParameter( m_CGeffect, "proj" ); return S_OK; }

  24. CDXMyApp::InitD3D() • CGparametercgGetNamedEffectParameter( CGeffecteffect, constchar * name ); • Az effect-ben található, namenevű globális változó azonosítóját adja vissza • Ezzel tudjuk összekötni a shadereinkben lévő „külső” (globális, uniform) változókat és az alkalmazásunkat

  25. CDXMyApp::CleanUpD3D() VOIDCDXMyApp::CleanUpD3D() { cgD3D9SetDevice(NULL); cgDestroyEffect(m_CGeffect); cgDestroyContext(m_CGcontext); }

  26. CDXMyApp::InitDeviceObjects() HRESULTCDXMyApp::InitDeviceObjects() { … D3DXMatrixIdentity(&matProj); cgSetMatrixParameterfc( m_CGparam_proj, &(matProj.m[0][0]) ); … }

  27. CDXMyApp::InitDeviceObjects() • voidcgSetMatrixParameterfc( CGparameterparam, constfloat * matrix ); • A param-mal azonosított shader-változó értékéül a matrix memóriaterületen található 16 float-ot adja (f) • Oszlop-folytonos tárolást feltételez a matrix-nál (c)

  28. CDXMyApp::Render() VOID CDXMyApp::Render() { … CGpasspass = cgGetFirstPass( m_CGtechnique ); while( pass ) { cgSetPassState( pass ); … cgResetPassState( pass ); pass = cgGetNextPass( pass ); } …

  29. CDXMyApp::FrameUpdate() VOIDCDXMyApp::FrameUpdate() { D3DXMatrixIdentity(&matView); cgSetMatrixParameterfc( m_CGparam_view, &(matView.m[0][0]) ); }

  30. MyFX.cgfx float4x4 model; float4x4 view; float4x4proj; float4MyFS(VS_Output IN) : COLOR0 { returnIN.c; } techniquemyTechnique{ pass{ VertexProgram = compilevs_2_0MyVS(); FragmentProgram = compileps_2_0MyFS(); } }

  31. MyFX.cgfx struct VS_Input { float3 p : POSITION; float4 c : COLOR; }; structVS_Output { float4 p : POSITION; float4 c : COLOR; };

  32. MyFX.cgfx VS_Output MyVS(VS_Input IN) { VS_Output OUT; float4x4mv= mul(view, model); float4x4mvp = mul(proj, mv); OUT.p = mul( mvp, float4(IN.p, 1)); OUT.c = IN.c; return OUT; }

  33. MyFX.cgfx • matrix-columnvector: mul(M, v); • rowvector-matrix: mul(v, M); • matrix-matrix: mul(M, N);

  34. MyFX.cgfx float4MyFS(VS_Output IN) : COLOR0 { returnIN.c; }

  35. Tartalom • CG effektek • Input kezelés

More Related