Terep Szécsi László. Mechanizmus NxHeightField-ek definiálása PhysicsModel-be NxHeightFieldShapeDesc-ek betöltése Mesh-ek gyártása az NxHeightField- ekből.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

2010/2011 ősz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál  Részei.
GraphGame gg001-Triangle
Lua script Szécsi László
LEgyméretű tömbök, vektorok Alkalmazott Informatikai Tanszék SZÁMÍTÁSTECHNIKA I. dr.Dudás László 17./0. lVektorok definiálása lVektorok definiálása kezdőértékekkel.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Szécsi László. June 2010 DirectX SDK Visual Studio 2010.
Grafikus játékok fejlesztése Szécsi László g11-physics
Mesh betöltés, kirajzolás Szécsi László. dx11-ben nincs – játékfejlesztők írnak maguknak úgyis DXUT-ban van – CDXUTSDKMesh – csak sdkmesh formátumot tud.
GPGPU labor I. OpenGL, Cg.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
További vektor, mátrix algoritmusok
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Számítógépes grafika 3. gyakorlat.
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
2008/2009 tavasz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál 
1 AAO folytatás ++ Csink László. 2 Rekurzív bináris keresés (rendezett tömbben) public static int binker(int[] tomb, int value, int low, int high) public.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Térfogatvizualizáció
Motor IIII. Vezérlés Szécsi László. Letöltés diák: //l09-engine4.ppt.
Motor IIII. PhysX utáni rendberakás Vezérlés Szécsi László.
Motor II. Env map Spotlight Szécsi László. Letöltés /code/E/code/EggCoreSecondBase.zip Kibontani (vagy előző labor folyt.):
Fraktálok és csempézések
PhysX autó Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l12-car.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.
DirectX9 empty project Szécsi László. Visual Studio Első indításkor C++ választása.
Motor I. Scene graph XML Rendering Szécsi László.
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Vízfelület Szécsi László. Nyílt víz a nyílt óceánon a felületi cseppecskék körmozgást végeznek trochoid hullámforma hullámhossz hullámmagasság amplitúdó.
PhysX integráció Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l11-physx.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.
Transzformációk, textúrák, árnyalás Szécsi László.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
Térfogatvizualizáció
Textúrák Grafikus játékok fejlesztése Szécsi László g07-texture.
Kamera, 3D, transzformációk Szécsi László. Math.zip kibontása az Egg projectkönyvtárba – float2, foat3, float4 típusok, HLSL-ben megszokott műveletekkel.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
Grafikus játékok fejlesztése Szécsi László g10-engine
Megjelenítő-motor, színtér- menedzsment Szécsi László.
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László g11-multipass.
Grafikus játékok fejlesztése Szécsi László t09-texture
OO framework, Egg util library László Szécsi. Projektek nem osztoznak semmilyen kódon – DXUT mindegyikben – effect betöltés, mesh betöltés, GUI mindegyikbe.
Geometry instancing Szécsi László. copy-paste-rename gg009-Gui folder vcxproj, filters átnevezés solution/add existing project rename project working.
Textúrázás Szécsi László. giraffe.jpg letöltése SolutionDir/Media folderbe.
Rekurzív algoritmusok
GPGPU labor III. Iteratív algoritmusok. Kezdeti teendők Tantárgy honlapja, Iteratív algoritmusok A labor kiindulási alapjának letöltése (lab3base.zip),
Számítógépes grafika DirectX 2. gyakorlat. Emlékeztető Előző órán áttekintettük a szükséges WinAPI- s alapokat Illetve röviden beletekintettünk a félév.
Számítógépes grafika DirectX 5. gyakorlat. Emlékeztető Háromdimenziós alapok befejezése Textúrázás.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
CUDA C/C++ programozás Textúra memória A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos.
Motor IIII. PhysX utáni rendberakás Vezérlés Szécsi László.
Vizualizáció és képszintézis Térfogati textúrák kezelése (Dart + GLSL) Szécsi László.
Vizualizáció és képszintézis
Vizualizáció és képszintézis
Szécsi László 3D Grafikus Rendszerek 14. előadás
Vizualizáció és képszintézis
GPGPU – CUDA 2..
gg004-Mesh project copy-paste-rename gg002-App folder
Villogó delay függvény használata nélkül
Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek
Kamera, 3D, transzformációk Szécsi László
Material+ kioptimalizált uniformok
Sw2 PhysX.
OpenGL V.
Ghost Hunter Game logic/HUD.
Environment mapping Szécsi László
Függvénysablonok használata
Előadás másolata:

Terep Szécsi László

Mechanizmus NxHeightField-ek definiálása PhysicsModel-be NxHeightFieldShapeDesc-ek betöltése Mesh-ek gyártása az NxHeightField- ekből ShadedMesh a Meshhez PhysicsEntity

PhysicsModel Építés NxHeightField NxHeightFieldShapeDesc Mesh Actor ShadedMesh

XML <PhysicsHeightField name="terrain" numberOfRows="128" numberOfColumns="128" fileName="mindegy" /> <NxHeightFieldShape heightField="terrain" rowScale="16" columnScale="16" heightScale="10" />

XML <Texture name="kdMap" file="chessboard.jpg" />

XML <PhysicsEntity name="terrain" shadedMesh="terrain" physicsModel="terrain" position.x="-1024" position.y="-40" position.z="-1024"/> groundot meg vegyük ki terep sarka

Directory.h typedef std::map< const std::wstring, NxHeightField*> PhysicsHeightFieldDirectory;

EngineCore PhysicsHeightFieldDirectory physicsHeightFieldDirectory; void loadPhysicsHeightFields( XMLNode& xMainNode); void loadNxHeightFieldShapes( XMLNode& physicsModelNode, PhysicsModel* physicsModel);

LPD3DXMESH createMeshFromHeightField( NxHeightField* heightField, double rowScale, double columnScale, double heightScale); void createHeightFieldMeshes( XMLNode& xMainNode);

EngineCore.cpp void EngineCore::loadLevel() { //materialt hozzuk ide előre loadPhysicsMaterials(xMainNode); loadPhysicsHeightFields(xMainNode); createHeightFieldMeshes(xMainNode); loadMeshes(xMainNode); loadShadedMeshes(xMainNode);

ReleaseManagedResources delete sceneRoot; { PhysicsHeightFieldDirectory::iterator i = physicsHeightFieldDirectory.begin(); while(i != physicsHeightFieldDirectory.end()){ nxPhysicsSDK->releaseHeightField( *i->second); i++; } nxPhysicsSDK->releaseScene(*nxScene); nxPhysicsSDK->release();

loadPhysicsHeightFields eleje void EngineCore::loadPhysicsHeightFields( XMLNode& xMainNode) { int iPhysicsHeightField = 0; XMLNode physicsHeightFieldNode; while( !(physicsHeightFieldNode = xMainNode.getChildNode( L"PhysicsHeightField", iPhysicsHeightField)).isEmpty() ) { const wchar_t* fileName = physicsHeightFieldNode|L"fileName";

folyt.: leíró kitöltése NxHeightFieldDesc desc; desc.nbRows = physicsHeightFieldNode.readLong( L"numberOfRows", 128); desc.nbColumns = physicsHeightFieldNode.readLong( L"numberOfColumns", 128); desc.format = NX_HF_S16_TM; desc.sampleStride = sizeof(NxHeightFieldSample); desc.verticalExtent = -1000; desc.thickness = 0; desc.convexEdgeThreshold = 0;

folyt.: random magasságok NxHeightFieldSample* samples = new NxHeightFieldSample[desc.nbRows * desc.nbColumns]; desc.samples = (void*)samples; for(int i=0; i < desc.nbRows; i++){ for(int j=0; j < desc.nbColumns; j++){ NxHeightFieldSample& e = samples[i + j*desc.nbRows]; e.height = rand() % 0xffff; e.materialIndex0 = 0; e.materialIndex1 = 1; e.tessFlag = 0; e.unused = 0;}

loadPhysicsHeightFields vége NxHeightField* nxHeightField = nxPhysicsSDK ->createHeightField(desc); delete samples; const wchar_t* physicsHeightFieldName = physicsHeightFieldNode|L"name"; physicsHeightFieldDirectory [physicsHeightFieldName] = nxHeightField; iPhysicsHeightField++; }}

EngineCore.cpp void EngineCore::loadPhysicsModels( XMLNode& xMainNode) { loadNxWheelShapes(physicsModelNode, physicsModel); loadNxHeightFieldShapes( physicsModelNode, physicsModel);

EngineCore.cpp void EngineCore::loadNxHeightFieldShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel){ int iShape = 0; XMLNode shapeNode; while( !(shapeNode = physicsModelNode.getChildNode( L"NxHeightFieldShape", iShape)).isEmpty() ) { NxHeightFieldShapeDesc* nxHeightFieldShapeDesc = new NxHeightFieldShapeDesc(); loadShapeDesc(shapeNode, nxHeightFieldShapeDesc); // ide jön a következő dia szövege physicsModel->addShape(nxHeightFieldShapeDesc); iShape++; }

EngineCore.cpp const wchar_t* heightFieldName = shapeNode|L"heightField"; if(heightFieldName) { PhysicsHeightFieldDirectory::iterator iPhysicsHeightField = physicsHeightFieldDirectory.find(heightFieldName); if(iPhysicsHeightField != physicsHeightFieldDirectory.end()) { nxHeightFieldShapeDesc->heightField = iPhysicsHeightField->second; nxHeightFieldShapeDesc->columnScale = shapeNode.readDouble(L"columnScale", 16.0); nxHeightFieldShapeDesc->rowScale = shapeNode.readDouble(L"rowScale", 16.0); nxHeightFieldShapeDesc->heightScale = shapeNode.readDouble(L"heightScale", 20.0) / (double)0xffff; nxHeightFieldShapeDesc->materialIndexHighBits = 0; nxHeightFieldShapeDesc->holeMaterial = 2; nxHeightFieldShapeDesc->meshFlags = 0; }

EngineCore.cpp void EngineCore::createHeightFieldMeshes(XMLNode& xMainNode){ int iMesh = 0; XMLNode meshNode; while( !(meshNode = xMainNode.getChildNode(L"HeightFieldMesh", iMesh)).isEmpty()) { const wchar_t* name = meshNode|L"name"; if(name){ // ide jön a következő dia szövege } iMesh++; }

createHeightFieldMeshes mag const wchar_t* heightFieldName = meshNode|L"heightField"; if(heightFieldName) { PhysicsHeightFieldDirectory::iterator iHeightField = physicsHeightFieldDirectory.find(heightFieldName); if(iHeightField != physicsHeightFieldDirectory.end()) { LPD3DXMESH mesh = createMeshFromHeightField(iHeightField->second, meshNode.readDouble(L"rowScale", 16.0), meshNode.readDouble(L"columnScale", 16.0), meshNode.readDouble(L"heightScale", 20)); ); meshDirectory[name] = mesh; }

createMeshFromHeightField eleje LPD3DXMESH EngineCore::createMeshFromHeightField( NxHeightField* heightField, double rowScale, double columnScale, double heightScale) { unsigned int nCols = heightField->getNbColumns(); unsigned int nRows = heightField->getNbRows(); unsigned int nTileColumns = nCols-1; unsigned int nTileRows = nRows-1; NxHeightFieldSample* samples = new NxHeightFieldSample[nCols * nRows]; heightField->saveCells((void*)samples, sizeof(NxHeightFieldSample) * nCols * nRows);

createMeshFromHeightField folyt. LPD3DXMESH mesh; D3DXCreateMeshFVF(nTileRows * nTileColumns * 2, nRows * nCols, 0, D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0), device, &mesh); LPDIRECT3DINDEXBUFFER9 terrainIndexBuffer; LPDIRECT3DVERTEXBUFFER9 terrainVertexBuffer; mesh->GetVertexBuffer(&terrainVertexBuffer); mesh->GetIndexBuffer(&terrainIndexBuffer);

createMeshFromHeightField folyt. struct TerrainVertex{D3DXVECTOR3 pos; D3DXVECTOR3 normal; D3DXVECTOR2 tex;} *vertexData; terrainVertexBuffer->Lock(0, sizeof(TerrainVertex) * nRows * nCols, (void**)&vertexData, 0); for(int i=0; i<nRows; i++) { for(int j=0; j<nCols; j++){ vertexData[i * nCols + j].pos.x = (float)i * rowScale; vertexData[i * nCols + j].pos.y = samples[i*(nTileColumns+1) + j].height / (double)0xffff * heightScale; vertexData[i * nCols + j].pos.z = (float)j * columnScale; vertexData[i * nCols + j].tex.x = (float)j / nTileRows; vertexData[i * nCols + j].tex.y = (float)i / nTileColumns; vertexData[i * nCols + j].normal.x = 0; vertexData[i * nCols + j].normal.y = 1; vertexData[i * nCols + j].normal.z = 0; } terrainVertexBuffer->Unlock();

createMeshFromHeightField folyt. short* indexData; terrainIndexBuffer->Lock(0, sizeof(short) * 3 * 2 * nTileRows * nTileColumns, í(void**)&indexData, 0); for(int i=0; i<nTileRows; i++) for(int j=0; j<nTileColumns; j++){ if(i%2 == 0) { indexData[ (i * nTileColumns + j) * 6] = i * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 1] = i * nCols + j + 1; indexData[ (i * nTileColumns + j) * 6 + 2] = (i + 1) * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 4] = i * nCols + j + 1; indexData[ (i * nTileColumns + j) * 6 + 3] = (i + 1) * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 5] = (i + 1) * nCols + j + 1; } else { indexData[ (i * nTileColumns + j) * 6] = i * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 1] = (i + 1) * nCols + j + 1; indexData[ (i * nTileColumns + j) * 6 + 2] = (i + 1) * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 4] = i * nCols + j; indexData[ (i * nTileColumns + j) * 6 + 5] = i * nCols + j + 1; indexData[ (i * nTileColumns + j) * 6 + 3] = (i + 1) * nCols + j + 1; } terrainIndexBuffer->Unlock();

createMeshFromHeightField vége terrainVertexBuffer->Release(); terrainIndexBuffer->Release(); return mesh; }

Próba tereprally

Terep textúrázása egy textúra a lehetséges csempékkel terrain_tiles.png egy textúra a talajtípus- információval terrain_type.png

új effect: terrain.fx includeoljuk be az engineCore.fx-be

terrain.fx texture2D typeMap; sampler2D typeSampler = sampler_state { texture = ; MipFilter = Point; MagFilter = Linear; MinFilter = Linear; AddressU = WRAP; AddressV = WRAP; }; texture2D tileMap; sampler2D tileSampler = sampler_state { texture = ; MipFilter = Linear; MagFilter = Linear; MinFilter = Linear; AddressU = WRAP; AddressV = WRAP; };

input-output struct TerrainInput { float4 pos: POSITION; float2tex: TEXCOORD0; }; struct TerrainOutput { float4 pos: POSITION; float2 tex: TEXCOORD0; };

vertex shader TerrainOutput vsTerrain(TerrainInput input) { TerrainOutput output = (TerrainOutput)0; output.pos = mul(input.pos, modelViewProjMatrix); output.tex = input.tex; return output; }

uniform paraméterek float4 terrainTileRatio = float4(1, 0.25, 0, 0); float4 terrainTextureScale = 32; milyen magas egy csempe a tileMap textúrában hány csempével legyen lefedve a megasságmező

pixel shader float4 psTerrain(TerrainOutput input) : COLOR0 { float tileIndex = tex2Dlod(typeSampler, float4(input.tex, 0, 0)) / terrainTileRatio.y; float2 tileTex = frac(input.tex * terrainTextureScale.x); tileTex = (tileTex - float2(0.5, 0.5)) * / float2(0.5, 0.5); tileTex *= terrainTileRatio.xy;

pixel shader folyt. float p1 = floor(tileIndex); float p2 = p1 + 1; float4 c1 = tex2D(tileSampler, tileTex + float2(0, p1 * terrainTileRatio.y)); float4 c2 = tex2D(tileSampler, tileTex + float2(0, p2 * terrainTileRatio.y)); return lerp(c1, c2, tileIndex - p1); }

technique technique terrain { pass ExamplePass { CullMode = None; VertexShader = compile vs_3_0 vsTerrain(); PixelShader = compile ps_3_0 psTerrain(); }

XML

Gond: mipmappelés