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 – float4x4 típus Cam.zip kibontása az Egg projectkönyvtárba – Egg::Cam::Base – kamera interface – Egg::Cam::FirstPerson – WASD + egér Math, Cam filterek létrehozása, forrásfileok hozzáadása az Egg projecthez
A windows.h-ben definiált makrók nem kellenek ezért a DXUT.h-ban az#include előtt #define NOMINMAX és nem akad össze a Math::min, Math::max- xal
copy-paste-rename gg004-Mesh folder vcxproj, filters átnevezés solution/add existing project rename project working dir: $(SolutionDir) Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" build, run
#include "Cam/FirstPerson.h" Egg::Cam::FirstPerson::P firstPersonCam; – firstPersonCam = Egg::Cam::FirstPerson::create(); void animate(double dt, double t); bool processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Game::animate(double dt, double t) { if(!firstPersonCam) return; firstPersonCam->animate(dt); } bool Game::processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(!firstPersonCam) return false; firstPersonCam->processMessage(hWnd, uMsg, wParam, lParam); return false; }
Solution/add solution folder: fx A filerendszerben is hozzuk létre az fx alkönyvtárat a GraphGame-ben GraphGame/fx/basic.fx létrehozása – sima text file fx/add existing item – basic.fx berakása ez az effect file alapshadereket tartalmaz majd, ami mindig kellhet
transzformációkat végrehajtó vertex shader – be: modell pos, model normal, tex – ki: képernyő pos, világ pos, világ normal, tex – trafó mátrixok uniform paraméterek kamerától fog majd függeni az érték primitív árnyalást számoló pixel shader – ne legyen egyszínű – normal.z abszolútértéke a szín – (függőleges irányfény)
float4x4 modelMatrix; float4x4 modelMatrixInverse; float4x4 modelViewProjMatrix; #5.0#5.0
struct IaosTrafo { float4 pos: POSITION; float3 normal : NORMAL; float2 tex : TEXCOORD; }; struct VsosTrafo { float4 pos : SV_POSITION; float4 worldPos : WORLDPOS; float3 normal : NORMAL; float2 tex : TEXCOORD; }; #5.1#5.1
VsosTrafo vsTrafo(IaosTrafo input) { VsosTrafo output = (VsosTrafo)0; output.pos = mul(input.pos, modelViewProjMatrix); output.worldPos = mul(input.pos, modelMatrix); output.normal = mul(modelMatrixInverse, float4(input.normal.xyz, 0.0)); output.tex = input.tex; return output; } #5.2#5.2
float4 psBasic(VsosTrafo input) : SV_Target { return saturate(input.normal).y; } #5.2#5.2
technique11 basic { pass basic { SetVertexShader ( CompileShader( vs_5_0, vsTrafo() ) ); SetPixelShader( CompileShader( ps_5_0, psBasic() ) ); } #5.3#5.3
#include // and nothing else #5.3#5.3
ID3DX11EffectPass* idlePass = effect- >GetTechniqueByName("idle")- >GetPassByName("idle"); Egg::Mesh::Material::P idleMaterial = Egg::Mesh::Material::create(idlePass, 0); ID3DX11EffectPass* basicPass = effect- >GetTechniqueByName("basic")- >GetPassByName("basic"); Egg::Mesh::Material::P idleMaterial = Egg::Mesh::Material::create(basicPass, 0); #6.0
#include "Math/math.h"
using namespace Egg::Math; effect-> GetVariableByName("modelMatrix")-> AsMatrix()->SetMatrix( (float*)&float4x4::identity ); effect-> GetVariableByName("modelMatrixInverse") ->AsMatrix()->SetMatrix( (float*)&float4x4::identity ); float4x4 viewProjMatrix = firstPersonCam->getViewMatrix() * firstPersonCam->getProjMatrix(); effect->GetVariableByName("modelViewProjMatrix") ->AsMatrix()-> SetMatrix( (float*)&viewProjMatrix ); #6.1
HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) { app->setSwapChain(pSwapChain, pBackBufferSurfaceDesc); app->createSwapChainResources(); return S_OK; } #6.1
void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext ) { app->releaseSwapChainResources(); } #6.1
HRESULT createSwapChainResources(); HRESULT releaseSwapChainResources(); #6.1
HRESULT Game::createSwapChainResources() { firstPersonCam->setAspect( (float)backbufferSurfaceDesc.Width / backbufferSurfaceDesc.Height); return S_OK; } #6.1
HRESULT Game::releaseSwapChainResources() { return S_OK; } #6.1