360 likes | 485 Views
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)
E N D
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 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
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
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ő
C for Graphics adattípusok • Egyéb alap adattípusok: • float4: 1 dimenziós float vektor (float3, ...) • float4x4: 4x4-es float mátrix
C for Graphics műveletek • Vektorműveletek • dot, cross stb. • Egyéb: • lerp(a, b, w): lineáris interpoláció
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.)
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 {...}
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= …
CgFX • Technikára vagy egész effektre globális változói is lehetnek • Ezekhez szemantika is rendelhető: • float4x4myViewMatrix : ViewMatrix; • texture2DsomeTexture : DiffuseMap;
Első CgFX-es program • Maga a keretrendszer: http://cg.elte.hu/~valasek/keretek/DX_Template.zip
DXMyApp.h private: CGcontext m_CGcontext; CGeffect m_CGeffect; CGtechniquem_CGtechnique; CGparameter m_CGparam_world; CGparameter m_CGparam_view; CGparameter m_CGparam_proj;
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
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
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; }
CDXMyApp::InitD3D() HRESULTCDXMyApp::InitD3D() { m_CGcontext= cgCreateContext(); cgD3D9RegisterStates(m_CGcontext); m_CGeffect =cgCreateEffectFromFile( m_CGcontext, "myFX.cgfx", NULL ); m_CGtechnique= cgGetFirstTechnique( m_CGeffect);
CDXMyApp::InitD3D() • CGcontextcgCreateContext() • Ezzel hozunk létre egy context-et • A CG kezeli
CDXMyApp::InitD3D() • void cgD3D9RegisterStates( CGcontextcontext) • Az effekt fájlokban található D3D9 állapotváltozó értékadások érvényesítése
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
CDXMyApp::InitD3D() • CGtechniquecgGetFirstTechnique( CGeffecteffect) • Az effect-ben található első technika azonosítóját adja vissza
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; }
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
CDXMyApp::CleanUpD3D() VOIDCDXMyApp::CleanUpD3D() { cgD3D9SetDevice(NULL); cgDestroyEffect(m_CGeffect); cgDestroyContext(m_CGcontext); }
CDXMyApp::InitDeviceObjects() HRESULTCDXMyApp::InitDeviceObjects() { … D3DXMatrixIdentity(&matProj); cgSetMatrixParameterfc( m_CGparam_proj, &(matProj.m[0][0]) ); … }
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)
CDXMyApp::Render() VOID CDXMyApp::Render() { … CGpasspass = cgGetFirstPass( m_CGtechnique ); while( pass ) { cgSetPassState( pass ); … cgResetPassState( pass ); pass = cgGetNextPass( pass ); } …
CDXMyApp::FrameUpdate() VOIDCDXMyApp::FrameUpdate() { D3DXMatrixIdentity(&matView); cgSetMatrixParameterfc( m_CGparam_view, &(matView.m[0][0]) ); }
MyFX.cgfx float4x4 model; float4x4 view; float4x4proj; float4MyFS(VS_Output IN) : COLOR0 { returnIN.c; } techniquemyTechnique{ pass{ VertexProgram = compilevs_2_0MyVS(); FragmentProgram = compileps_2_0MyFS(); } }
MyFX.cgfx struct VS_Input { float3 p : POSITION; float4 c : COLOR; }; structVS_Output { float4 p : POSITION; float4 c : COLOR; };
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; }
MyFX.cgfx • matrix-columnvector: mul(M, v); • rowvector-matrix: mul(v, M); • matrix-matrix: mul(M, N);
MyFX.cgfx float4MyFS(VS_Output IN) : COLOR0 { returnIN.c; }
Tartalom • CG effektek • Input kezelés