120 likes | 231 Views
GraphGame gg0 10 - Instancing. Geometry instancing Szécsi László. gg0 10 - Instancing project. copy-paste-rename gg00 9 - Gui folder vcxproj , filters átnevezés solution /add existing project rename project working dir: $( SolutionDir )
E N D
GraphGamegg010-Instancing Geometry instancing SzécsiLászló
gg010-Instancingproject • copy-paste-renamegg009-Guifolder • vcxproj, filters átnevezés • solution/add existing project • rename project • working dir: $(SolutionDir) • Project Properties/ConfigurationProperties/Debugging/CommandArguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" • build, run
Game.cpp #include "Mesh/Instanced.h"
Mesh::Instanced • index buffer + vertex bufferek + instance bufferek + elemleírás • konstruktor összebuherálja az egyes bufferekhez kapott elemleírásokat • draw metódus • context->IASetIndexBuffer(indexBuffer, indexFormat, 0); • context->IASetVertexBuffers(0, nVertexBuffers, vertexBuffers, vertexStrides, zeros); • context->DrawIndexedInstanced(nIndices, nInstances, 0, 0, 0);
Game::createResources using namespace Egg::Math; Egg::Math::float4x4 modelMatrices[200]; for(intiInstance=0; iInstance<200; iInstance++ ) modelMatrices[iInstance] = float4x4::translation( float3::random(0, 20) ).transpose();
Game::createResources D3D11_INPUT_ELEMENT_DESC modelMatrixElements[4] = { { "INSTANCEMODEL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0 * sizeof(float4), D3D11_INPUT_PER_INSTANCE_DATA, 1}, { "INSTANCEMODEL", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 1 * sizeof(float4), D3D11_INPUT_PER_INSTANCE_DATA, 1}, { "INSTANCEMODEL", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 2 * sizeof(float4), D3D11_INPUT_PER_INSTANCE_DATA, 1}, { "INSTANCEMODEL", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 3 * sizeof(float4), D3D11_INPUT_PER_INSTANCE_DATA, 1} }; Egg::Mesh::InstanceBufferDescinstanceBufferDesc; instanceBufferDesc.elements = modelMatrixElements; instanceBufferDesc.nElements = 4; instanceBufferDesc.instanceStride = sizeof(float4x4); instanceBufferDesc.instanceData = modelMatrices;
Game::createResources Egg::Mesh::Instanced::P instancedMesh= Egg::Mesh::Instanced::create( device, 200, &instanceBufferDesc, 1, indexedMesh); ID3DX11EffectPass* basicPass = effect->GetTechniqueByName("instanced")->GetPassByName("instanced"); Egg::Mesh::Material::P envmappedMaterial = Egg::Mesh::Material::create(basicPass, 0); shadedMesh = binder->bindMaterial(envmappedMaterial, instancedMesh);
#9.0 fx/main.fx structIaosInstanced { float4 pos: POSITION; float3 normal : NORMAL; float2 tex : TEXCOORD; float4x4 instanceModelMatrix: INSTANCEMODEL; }; VsosTrafovsInstanced(IaosInstanced input) { VsosTrafooutput = (VsosTrafo)0; output.worldPos= mul(input.pos, input.instanceModelMatrix); output.pos = mul(output.worldPos, modelViewProjMatrix); output.normal= mul( float4(input.normal.xyz, 0.0), input.instanceModelMatrix); output.tex = input.tex; return output; } modellel nemkéne szorozni, mertugye már megvolt modelinversetransposed csak akkor egyezik meg a modellel, ha csak eltolás+forgatás+izometrikus skálázás van
#9.0 fx/main.fx technique11 instanced { pass instanced { SetVertexShader( CompileShader(vs_5_0, vsInstanced() ) ); SetPixelShader( CompileShader(ps_5_0, psEnvMapped() ) ); } }
FELADAT: forgó zsiráfok • instancedMeshtagvaltozóba • animateből elérjük, releaseResourcesbanreset • animate • instancebuffer lekérése • device->GetImmediateContext • instancebuffermappelése • feltöltése időfüggő (de nem random!) adattal • unmap • contextrelease