Transcript
Page 1: Direct3D11  KickStart

Direct3D11 KickStart

Szécsi László

Page 2: Direct3D11  KickStart

Direct3D11 SDK

• June 2010 DirectX SDK• Visual Studio 2010

Page 3: Direct3D11  KickStart

GPU pipeline input

• vertex bufferek• index buffer• rajzolási állapot– egyes pipelineelemek működési beállításai– programozható elemek shader programjai

• erőforrások – globális memóriában adatok– globális (uniform) változók– textúrák– adatbufferek

csak olvasható

Page 4: Direct3D11  KickStart

GPU pipeline output

• kép– render target• frame buffer• textúra

– mélységbuffer (+stencil)• adatbuffer– stream out target

• read/write (GpGpu-hoz)– unordered access view

Page 5: Direct3D11  KickStart

GPU pipeline

IA VS HS DS GS PS OMRSTess

tessfactor

tessfactor

IA

SO+mindeki olvashatja a uniform változókat, textúrákat, buffereket

Page 6: Direct3D11  KickStart

Rajzolási állapot

IA OMRSTess

tessfactor

IA

SO

input layout

primitivetopology

rasterizerstate

depth-stencilstate

blendstate

viewport

Page 7: Direct3D11  KickStart

Alapinterface-ek

• ID3D11Device (1 van)– erőforrások létrehozása, felszabadítása• textúra, buffer, shader, state block

• ID3D11DeviceContext (1 immediate, * deferred)

– rajzolási állapot, I/O, shader beállítás– rajzolás

• ID3DXEffect (*)– shaderek fordítása, menedzselése– shaderek, rajzolási állapotok beállítása scriptből

Page 8: Direct3D11  KickStart

ID3D11Device interface metódusok

• erőforrások létrehozása– CreateBuffer– CreateTexture2D

• erőforrásokhoz nézetek létrehozása– CreateShaderResourceView– CreateRenderTargetView

• shaderek és rajzolásiállapot-struktúrák– CreateVertexShader– CreateBlendState

Page 9: Direct3D11  KickStart

ID3DDeviceContext

• bemenetek és kimenetek beállítása– IASetIndexBuffer, IASetVertexBuffers– OMSetRenderTargets

• rajzolási állapot beállítása– RSSetState, OMSetBlendState

• shaderek, uniform paraméterek beállítása – VSSetShader, PSSetShader

• rajzolás– Draw, DrawIndexed, DrawIndexInstanced

Page 10: Direct3D11  KickStart

DXUT

• mint a GLUT– ablakozás, eseménykezelés, callback függvények

• csomó minden más– kamera osztályok– user interface

• nem külön lib, hanem forrásban ott van minden Empty projectben alapból

Page 11: Direct3D11  KickStart

DXUT Callback beállítás

DXUTSetCallbackD3D11DeviceAcceptable( IsD3D11DeviceAcceptable );

DXUTSetCallbackD3D11DeviceCreated( OnD3D11CreateDevice );

DXUTSetCallbackD3D11SwapChainResized( OnD3D11ResizedSwapChain );

DXUTSetCallbackD3D11FrameRender( OnD3D11FrameRender );

DXUTSetCallbackD3D11SwapChainReleasing( OnD3D11ReleasingSwapChain );

DXUTSetCallbackD3D11DeviceDestroyed( OnD3D11DestroyDevice );

Page 12: Direct3D11  KickStart

DXUT init

DXUTInit( true, true, NULL ); DXUTSetCursorSettings( true, true );DXUTCreateWindow( L"KickStart11" );

DXUTCreateDevice( D3D_FEATURE_LEVEL_10_0, true, 640, 480 );

DXUTMainLoop(); // Enter into the DXUT ren der loop

Page 13: Direct3D11  KickStart

Empty project

• Előző két dián lévő kód már benne lesz• Start Menu/DirectX SDK (June 2010)/DirectX

Sample Browser– install EmptyProject11– project neve: KickStart11

Page 14: Direct3D11  KickStart

Visual Studio 2010

• KickStart11_2010.sln megnyitása• DirectX 9 támogatás kidobása (opcionális)– delete EmptyProject9.cpp– minden D3D9-et tartalmazó sor törlése a

KickStart11.cpp-ből– 9-es libek kidobása a linker inputból

Page 15: Direct3D11  KickStart

Include és lib könyvtárak beállítása

• project properties (ez csak erre a projectre lesz érvényes)– Configuration properties/c/c++/general/additional

include directories• C:\Program Files\Microsoft DirectX SDK (June 2010)\

Include– Configuration properties/linker/general/additional

library directories• C:\Program Files\Microsoft DirectX SDK (June 2010)\

Lib\x86

Page 16: Direct3D11  KickStart

Include és lib könyvtárak beállítása

• gép alapon (minden projectre érvényes lesz)• view menu: property manager• property manager ablakban– pl. Debug | Win32– Microsoft.Cpp.Win32.User duplaklikk– VC++ directories alá az előző diákon szereplő

könyvtárak beállítása

Page 17: Direct3D11  KickStart

Itt tartunk – üres ablak

Page 18: Direct3D11  KickStart

KickStart11.cppglobális callback függvények• eszközesemények– OnD3D11CreateDevice program indul– OnD3D11ResizedSwapChain ablak létrejött– OnD3D11ReleasingSwapChain ablak megszűnt– OnD3D11DestroyDevice program vége

• vezérlési események– OnD3D11FrameRender rajzolás– OnFrameMove animáció– MsgProc windows üzenet

Page 19: Direct3D11  KickStart

Dxa::Base interface

• célszerű, hogy a globális callback függvények egy saját objektum metódusait hívják– ott tudjuk megvalósítani a funkciót– nem kell a KickStart11.cpp-be nyúlkálni

• ahhoz, hogy a saját objektum könnyen cserélhető legyen, legyen egy ősinterface– minden legyen a Dxa namespace-ben– az ősinterface a Dxa::Base– implementáló osztály Dxa::Sas : public Dxa::Base

Page 20: Direct3D11  KickStart

Dxa.h#pragma oncenamespace Dxa {

class Base{protected:

ID3D11Device* device;IDXGISwapChain* swapChain;DXGI_SURFACE_DESC backbufferSurfaceDesc;

public:Base(ID3D11Device* device)

{this->device = device; swapChain = NULL;}void setSwapChain(IDXGISwapChain* swapChain, const DXGI_SURFACE_DESC* backbufferSurfaceDesc) {

this->swapChain = swapChain; this->backbufferSurfaceDesc =

*backbufferSurfaceDesc;}virtual ~Base(){}// insert code from slide #0.1 here

};}

#0.0

Page 21: Direct3D11  KickStart

Dxa.h// insert this into code on slide #0.0virtual HRESULT createResources(){return S_OK;}virtual HRESULT createSwapChainResources(){return S_OK;}virtual HRESULT releaseResources(){return S_OK;}virtual HRESULT releaseSwapChainResources(){return S_OK;}virtual void animate(double dt, double t){}virtual bool processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){return false;}virtual void render(ID3D11DeviceContext* context){}

#0.1

Page 22: Direct3D11  KickStart

KickStart11.cpp#include "DXUT.h“#include "Dxa.h"Dxa::Base* application;

#1.0

Page 23: Direct3D11  KickStart

KickStart11.cppHRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) {application = new Dxa::Base(pd3dDevice);application->createResources();return S_OK;

}

#1.1

Page 24: Direct3D11  KickStart

KickStart11.cppHRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )

{application->setSwapChain(pSwapChain,pBackBufferSurfaceDesc);application->createSwapChainResources();return S_OK;

}

#1.2

Page 25: Direct3D11  KickStart

KickStart11.cppvoid CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )

{if(application)

application->animate(fElapsedTime, fTime);

}

#1.3

Page 26: Direct3D11  KickStart

KickStart11.cppvoid CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice,

ID3D11DeviceContext* pd3dImmediateContext, double fTime, float

fElapsedTime, void* pUserContext ){ // Clear render target and the depth stencil float ClearColor[4] = { 0.176f, 0.196f, 0.667f, 0.0f };

ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView();

ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView();

pd3dImmediateContext->ClearRenderTargetView( pRTV, ClearColor );

pd3dImmediateContext->ClearDepthStencilView( pDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );

}

#1.4

Page 27: Direct3D11  KickStart

KickStart11.cppvoid CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext,

double fTime, float fElapsedTime, void* pUserContext )

{if(application)application->render(pd3dImmediateContext);

}

#1.5

Page 28: Direct3D11  KickStart

KickStart11.cppvoid CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext )

{application->

releaseSwapChainResources();}

#1.6

Page 29: Direct3D11  KickStart

KickStart11.cppvoid CALLBACK OnD3D11DestroyDevice( void* pUserContext )

{application->releaseResources();delete application;application = NULL;

}

#1.7

Page 30: Direct3D11  KickStart

KickStart11.cppLRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )

{if(application)application->processMessage(hWnd, uMsg, wParam, lParam);return 0;

}

#1.8

Page 31: Direct3D11  KickStart

Itt tartunk

Page 32: Direct3D11  KickStart

Háromszög rajzolása

Dxa::Triangleerőforrás létrehozás/felszabadítás (vertex

buffer), render target törlés, rajzolás

Page 33: Direct3D11  KickStart

Dxa::Triangle

• Dxa::Base nem csinál semmit• származtatunk belőle Dxa::Triangle-t• felüldefiniáljuk a virtuális eseménykezelő

metódusokat– createResources– releaseResource– render

Page 34: Direct3D11  KickStart

DxaTriangle.h#pragma once#include "dxa.h"

namespace Dxa {class Triangle :public Dxa::Base{public:Triangle(ID3D11Device* device);HRESULT createResources();HRESULT releaseResources();void render(ID3D11DeviceContext* context);};

}

#2.0

Page 35: Direct3D11  KickStart

DxaTriangle.cpp#include "DXUT.h"#include "DxaTriangle.h"

Dxa::Triangle::Triangle(ID3D11Device* device):Base(device){}HRESULT Dxa::Triangle::createResources(){

return S_OK;}HRESULT Dxa::Triangle::releaseResources(){

return S_OK;}void Dxa::Triangle::render(ID3D11DeviceContext* context){}

#2.1

Page 36: Direct3D11  KickStart

KickStart11.cpp#include "DXUT.h"#include "Dxa.h"Dxa::Base* application;#include "DxaTriangle.h"

#2.3

Page 37: Direct3D11  KickStart

KickStart11.cppHRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,

void* pUserContext )

{

application = new //Dxa::Base(pd3dDevice);Dxa::Triangle(pd3dDevice);

application->createResources(); return S_OK;}

#2.4

Page 38: Direct3D11  KickStart

Itt tartunk

Page 39: Direct3D11  KickStart

Ezekre lesz szükség

IA VS PS OMRSIA

vertexbuffer

inputlayout

vertexshader

pixelshader

primitivetopology

maraddefault

maraddefault

= [x, y, z]

[x, y, z]

[x, y, z, 1]

[x, y, z, 1]

[x, y, z, 1]

Page 40: Direct3D11  KickStart

DxaTriangle.hclass Triangle :public Dxa::Base{ID3D11Buffer* vertexBuffer;ID3D11InputLayout* inputLayout;ID3D11VertexShader* vertexShader;ID3D11PixelShader* pixelShader;

public:

#2.5

Page 41: Direct3D11  KickStart

DxaTriangle.cppHRESULT Dxa::Triangle::createResources() {

D3D11_BUFFER_DESC desc;desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;desc.ByteWidth = sizeof(D3DXVECTOR3) * 3;desc.CPUAccessFlags = 0;desc.MiscFlags = 0;desc.StructureByteStride = sizeof(D3DXVECTOR3);desc.Usage = D3D11_USAGE_IMMUTABLE;

D3DXVECTOR3 vertexPositionArray[3] = { D3DXVECTOR3(0, 0, 0.5),D3DXVECTOR3(0, 1, 0.5),D3DXVECTOR3(1, 0, 0.5) };D3D11_SUBRESOURCE_DATA initData;initData.pSysMem = vertexPositionArray;initData.SysMemPitch = 0;initData.SysMemSlicePitch = 0;

device->CreateBuffer(&desc, &initData, &vertexBuffer);

#2.6

Page 42: Direct3D11  KickStart

DxaTriangle.cppdevice->CreateBuffer(&desc, &initData, &vertexBuffer);

const char* vertexShaderCode = "float4 vsIdle(float4 pos :POSITION ) :SV_Position {return pos;}";

ID3DBlob* vertexShaderByteCode;D3DX11CompileFromMemory(vertexShaderCode, strlen(vertexShaderCode), NULL, NULL, NULL, "vsIdle", "vs_5_0", 0, 0, NULL, &vertexShaderByteCode, NULL, NULL);

device->CreateVertexShader(vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), NULL, &vertexShader);

#2.7

Page 43: Direct3D11  KickStart

DxaTriangle.cpp// insert after #2.7D3D11_INPUT_ELEMENT_DESC positionElement;positionElement.AlignedByteOffset = 0;positionElement.Format = DXGI_FORMAT_R32G32B32_FLOAT;

positionElement.InputSlot = 0;positionElement.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;

positionElement.InstanceDataStepRate = 0;positionElement.SemanticIndex = 0;positionElement.SemanticName = "POSITION";

#2.8

Page 44: Direct3D11  KickStart

DxaTriangle.cpp// insert after #2.8device->CreateInputLayout(&positionElement, 1, vertexShaderByteCode

->GetBufferPointer(), vertexShaderByteCode

->GetBufferSize(), &inputLayout);

#2.9

Page 45: Direct3D11  KickStart

DxaTriangle.cpp// insert after #2.9const char* pixelShaderCode = "float4 psIdle() : SV_Target {return float4(1, 0, 0, 1);}";

ID3DBlob* pixelShaderByteCode;D3DX11CompileFromMemory(pixelShaderCode, strlen(pixelShaderCode), NULL, NULL, NULL, "psIdle", "ps_5_0", 0, 0, NULL, &pixelShaderByteCode, NULL, NULL);

device->CreatePixelShader(pixelShaderByteCode->GetBufferPointer(), pixelShaderByteCode->GetBufferSize(), NULL, &pixelShader);

#2.10

Page 46: Direct3D11  KickStart

DxaTriangle.cppHRESULT Dxa::Triangle::releaseResources()

{vertexBuffer->Release();inputLayout->Release();vertexShader->Release();pixelShader->Release();return S_OK;

}

#2.11

Page 47: Direct3D11  KickStart

DxaTriangle.cppvoid Dxa::Triangle::render(ID3D11DeviceContext* context)

{float clearColor[4] = { 0.9f, 0.7f, 0.1f, 0.0f };ID3D11RenderTargetView* defaultRtv = DXUTGetD3D11RenderTargetView();ID3D11DepthStencilView* defaultDsv = DXUTGetD3D11DepthStencilView();context->ClearRenderTargetView(defaultRtv, clearColor );context->ClearDepthStencilView( defaultDsv, D3D11_CLEAR_DEPTH, 1.0, 0 );

#2.12

Page 48: Direct3D11  KickStart

DxaTriangle.cpp// insert after #2.12unsigned int stride = sizeof(D3DXVECTOR3);unsigned int offset = 0;context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);context->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);context->IASetInputLayout(inputLayout);context->VSSetShader(vertexShader, NULL, 0);context->PSSetShader(pixelShader, NULL, 0);

context->Draw(3, 0);

#2.13

Page 49: Direct3D11  KickStart

Háromszög kész

Page 50: Direct3D11  KickStart

Honnan tudjuk mit kell beállítani?

• Start menu• doc

Page 51: Direct3D11  KickStart

Visual Studio 2010 tippek

• bepastelt kódhoz:– formáz: kijelöl, Ctrl+K, Ctrl+F

• általában kódoláshoz– kódieg.: eleje begépel, aztán Ctrl+space– metódus paraméterlistája• kurzor a zárójelek közé v. nyitó zárójel után• ctrl+alt+space

Page 52: Direct3D11  KickStart

Effect framework

Dxa::TriangleWithFxshaderek kényelmesebb kezelése

Page 53: Direct3D11  KickStart

Effects11

• 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 beállítóscript– technique: pass gyűjtemény– group: technique gyűjtemény

• erőforrások, uniform paraméterek átadása– globális változók

Page 54: Direct3D11  KickStart

ID3DX11Effect interface

• ID3DXEffectVariable gyűjtemény– scalar, vector, matrix– shaderResourceView (pl. textúra)

• ID3DXEffectGroup– ID3DXEffectTechnique• ID3DXEffectPass

– shader programok beállítása– rasterizer, blend, depthstencil állapot beállítása

• mindezek egy .fx fileban– HLSL shader kódok

Page 55: Direct3D11  KickStart

Effect framework beépítése a projektünkbe• 1. lehetőség– forrás lefordítása– <dxsdk dir>/Samples/C++/Effects11– kapott lib file belinkelése

• 2. lehetőség (bele akarunk hekkelni esetleg)– forrás bemásolása a KickStart11 könyvtárba– project hozzáadása a KickStart11 solutionhöz

Page 56: Direct3D11  KickStart

Effect11 project beépítése

• copy– c:\Program Files (x86)\Microsoft DirectX SDK (June

2010)\Samples\C++\Effects11\– d:\Education\KickStart\D3D11\KickStart11\

• solution/add/existing project– KickStart11/Effects11/Effects11_2010.vcxproj

• KickStart11 project properties– common properties– add new reference: Effects 11

Page 57: Direct3D11  KickStart

Effect11 include könyvtár

• KickStart11 project properties– configuration properties/c++/additional include

directories• Effects11\Inc

Page 58: Direct3D11  KickStart

Effect fileok

• hozzunk létre egy ‘fx’ alkönyvtárat a KickStart11-en belül

• abba egy idle.fx file– add new item/utility/text file

Page 59: Direct3D11  KickStart

fx/idle.fxfloat4 vsIdle(float4 pos : POSITION) : SV_Position {

return pos;}float4 psIdle() : SV_Target{

return float4(0, 1, 0, 1);}technique11 idle{

pass idle{SetVertexShader ( CompileShader( vs_5_0, vsIdle() ) );SetPixelShader( CompileShader( ps_5_0, psIdle() ) );}

}

#3.0

Page 60: Direct3D11  KickStart

Új osztály: Dxa::TriangleWithFx

• DxaTriangle.h, DxaTriangle.cpp tartalma bemásolva a DxaTriangleWithFx.h, ill. cpp-be

• Minden Triangle TriangleWithFx-re cserélve

Page 61: Direct3D11  KickStart

KickStart.cppDxa::Base* application;#include "DxaTriangle.h"#include "DxaTriangleWithFx.h"

#4.0

Page 62: Direct3D11  KickStart

KickStart11.cppHRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,

void* pUserContext )

{

application = new //Dxa::Base(pd3dDevice);//Dxa::Triangle(pd3dDevice);Dxa::TriangleWithFx(pd3dDevice);application->createResources();

return S_OK;}

#4.1

Page 63: Direct3D11  KickStart

DxaTriangleWithFx.h#pragma once#include "dxa.h"#include "d3dx11effect.h"

#4.2

Page 64: Direct3D11  KickStart

DxaTriangleWithFx.hID3D11VertexShader* vertexShader;ID3D11PixelShader* pixelShader;

ID3DX11Effect* effect;

public:TriangleWithFx(ID3D11Device* device);

#4.3

Page 65: Direct3D11  KickStart

DxaTriangleWithFx.cppconst char* vertexShaderCode = "float4 vsIdle(float4 pos : POSITION) : SV_Position {return pos;}";

ID3DBlob* vertexShaderByteCode;D3DX11CompileFromMemory(vertexShaderCode, strlen(vertexShaderCode), NULL, NULL, NULL, "vsIdle", "vs_5_0", 0, 0, NULL,

&vertexShaderByteCode, NULL, NULL);device->CreateVertexShader(vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), NULL, &vertexShader);

#4.4

Page 66: Direct3D11  KickStart

DxaTriangleWithFx.cppdevice->CreateInputLayout(&positionElement, 1, vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), &inputLayout);

#4.5

Page 67: Direct3D11  KickStart

DxaTriangleWithFx.cppconst char* pixelShaderCode = "float4 psIdle() : SV_Target {return float4(1, 0, 0, 1);}";

ID3DBlob* pixelShaderByteCode;D3DX11CompileFromMemory(pixelShaderCode, strlen(pixelShaderCode), NULL, NULL, NULL, "psIdle", "ps_5_0", 0, 0, NULL,

&pixelShaderByteCode, NULL, NULL);device->CreatePixelShader(pixelShaderByteCode->GetBufferPointer(), pixelShaderByteCode->GetBufferSize(), NULL, &pixelShader);

#4.6

Page 68: Direct3D11  KickStart

DxaTriangleWithFx.cppHRESULT Dxa::TriangleWithFx::createResources(){

ID3DBlob* compiledEffect = NULL;D3DX11CompileFromFileW( L"fx/idle.fx", NULL, NULL, NULL, "fx_5_0", 0, 0, NULL, &compiledEffect, NULL, NULL);

D3DX11CreateEffectFromMemory( compiledEffect->GetBufferPointer(), compiledEffect->GetBufferSize(),0, device, &effect);

#4.7

Page 69: Direct3D11  KickStart

DxaTriangleWithFx.cpp// append to createResourcesD3DX11_PASS_DESC idlePassDesc;effect->GetTechniqueByName("idle")->GetPassByName("idle")->GetDesc(&idlePassDesc);

device->CreateInputLayout(&positionElement, 1, idlePassDesc.pIAInputSignature, idlePassDesc.IAInputSignatureSize, &inputLayout);

#4.8

Page 70: Direct3D11  KickStart

DxaTriangleWithFx.cppHRESULT Dxa::TriangleWithFx::releaseResources()

{effect->Release();vertexBuffer->Release();inputLayout->Release();vertexShader->Release();pixelShader->Release();

#4.9

Page 71: Direct3D11  KickStart

DxaTriangleWithFx.cppcontext->VSSetShader(vertexShader, NULL, 0);

context->PSSetShader(pixelShader, NULL, 0);

effect->GetTechniqueByName("idle")->GetPassByName("idle")->Apply(0, context);

context->Draw(3, 0);

#4.10

Page 72: Direct3D11  KickStart

Effect framework háromszög kész

Page 73: Direct3D11  KickStart

Mesh + kamera

Dxa::MeshCammesh osztály, kamera,

transzformációk, advanced effect

Page 74: Direct3D11  KickStart

Mesh osztály

• dx11-ben nincs– játékfejlesztők írnak maguknak úgyis

• DXUT-ban van– CDXUTSDKMesh– csak sdkmesh formátumot tud betölteni– túl bonyolult most nekünk

• Saját Mesh osztály– vertex buffer, index buffer, vertex elements– saját formátum (.dgb) + konverter (dgbMaker)

Page 75: Direct3D11  KickStart

.dgb formátum

• bináris• vertex element descriptor• vertex buffer binárisan• index buffer binárisan• ennyi– nincs attribútum tábla– nincsenek anyagok– nincsenek textúrák– nincsenek submeshek

Page 76: Direct3D11  KickStart

Mesh osztály használataclass Mesh{ID3D11Buffer* vertexBuffer;ID3D11Buffer* indexBuffer;. . . // code deleted from herepublic:static HRESULT createMeshFromFile(const char* dgbFilename, ID3D11Device* device, Mesh** mesh);

~Mesh();HRESULT createInputLayout(ID3D11Device* device, D3DX11_PASS_DESC* passDesc, ID3D11InputLayout** inputLayout);

void draw(ID3D11DeviceContext* context);};

Page 77: Direct3D11  KickStart

Új effect file: fx/basic.fx

• 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)

Page 78: Direct3D11  KickStart

fx/basic.fxfloat4x4 modelMatrix;float4x4 modelMatrixInverse;float4x4 modelViewProjMatrix;

#5.0

Page 79: Direct3D11  KickStart

fx/basic.fxstruct 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

Page 80: Direct3D11  KickStart

fx/basic.fxVsosTrafo 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

Page 81: Direct3D11  KickStart

fx/basic.fxVsosTrafo 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.3

Page 82: Direct3D11  KickStart

fx/basic.fxfloat4 psBasic(VsosTrafo input) : SV_Target

{ return abs(saturate(input.normal).y);

}

#5.2

Page 83: Direct3D11  KickStart

fx/basic.fxtechnique11 basic{pass basic{

SetVertexShader ( CompileShader(vs_5_0, vsTrafo() ) );

SetPixelShader( CompileShader(ps_5_0, psBasic() ) );

}}

#5.3

Page 84: Direct3D11  KickStart

Új osztály: Dxa::MeshCam

• DxaMeshCam.h• DxaMeshCam.cpp

Page 85: Direct3D11  KickStart

KickStart.cpp#include "DxaTriangle.h#include "DxaTriangleWithFx.h"#include "DxaMeshCam.h"Dxa::Base* application;

#6.0

Page 86: Direct3D11  KickStart

KickStart11.cppHRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,

void* pUserContext )

{application = new //Dxa::Base(pd3dDevice);//Dxa::Triangle(pd3dDevice);//Dxa::TriangleWithFx(pd3dDevice);Dxa::MeshCam(pd3dDevice);application->createResources();

return S_OK;}

#6.1

Page 87: Direct3D11  KickStart

DxaMeshCam.h#pragma once#include "dxa.h"#include "Mesh.h“#include "DXUTCamera.h"

namespace Dxa {class MeshCam : public Dxa::Base{ // insert code from #6.3 herepublic:

MeshCam(ID3D11Device* device);HRESULT createResources();HRESULT releaseResources();HRESULT createSwapChainResources();HRESULT releaseSwapChainResources();void animate(double dt, double t);bool processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);void render(ID3D11DeviceContext* context);

};}

#6.2

Page 88: Direct3D11  KickStart

DxaMeshCam.hclass MeshCam :public Dxa::Base{// insert into code on #6.2ID3DX11Effect* effect;CFirstPersonCamera camera;Mesh* mesh;ID3D11InputLayout* inputLayout;

#6.3

Page 89: Direct3D11  KickStart

DxaMeshCam.cppDxa::MeshCam::MeshCam(ID3D11Device* device)

:Dxa::Base(device){camera.SetViewParams( &D3DXVECTOR3(0, 3, -10), &D3DXVECTOR3(0, 3, 0) );

}

#6.4

Page 90: Direct3D11  KickStart

DxaMeshCam.cppHRESULT Dxa::MeshCam::createResources() {ID3DBlob* compiledEffect = NULL;ID3DBlob* compilationErrors = NULL;HRESULT hr = D3DX11CompileFromFileW( L"fx/basic.fx", NULL, NULL,

NULL,"fx_5_0", 0, 0, NULL, &compiledEffect, &compilationErrors, NULL);

if(hr != S_OK) {if(compilationErrors != NULL)MessageBoxA( NULL, (LPSTR)compilationErrors->GetBufferPointer(),"Failed to create effect from file!", MB_OK);elseMessageBoxA( NULL, "File cound not be opened","Failed to create effect from file!",MB_OK);exit(-1);}

// insert next slides here return S_OK; }

#6.5

Page 91: Direct3D11  KickStart

DxaMeshCam.cpp// insert after #6.5hr = D3DX11CreateEffectFromMemory(compiledEffect->GetBufferPointer(), compiledEffect->GetBufferSize(),0, device, &effect);

if(hr != S_OK){MessageBoxA( NULL, "CreateEffectFromMemory failed","Failed to create effect from file!", MB_OK);exit(-1);

}

#6.6

Page 92: Direct3D11  KickStart

DxaMeshCam.cpp// insert after #6.6mesh = NULL;Mesh::createMeshFromFile("media/bigbunny.dgb", device, &mesh);

if(mesh == NULL){MessageBoxA( NULL, "Mesh could not be loaded.","Failed to create mesh from file!", MB_OK);exit(-1);

}

#6.7

Page 93: Direct3D11  KickStart

DxaMeshCam.cpp// insert after #6.7D3DX11_PASS_DESC basicPassDesc;effect->GetTechniqueByName("basic")->GetPassByName("basic")->GetDesc(&basicPassDesc);

mesh->createInputLayout(device, &basicPassDesc, &inputLayout);

#6.8

Page 94: Direct3D11  KickStart

DxaMeshCam.cppHRESULT Dxa::MeshCam::releaseResources()

{effect->Release();inputLayout->Release();delete mesh;return S_OK;

}

#6.9

Page 95: Direct3D11  KickStart

DxaMeshCam.cppHRESULT Dxa::MeshCam::

createSwapChainResources(){camera.SetProjParams(1.58, (float)

backbufferSurfaceDesc.Width / backbufferSurfaceDesc.Height, 0.1, 1000 );

return S_OK;}

#6.10

Page 96: Direct3D11  KickStart

DxaMeshCam.cppHRESULT Dxa::MeshCam::releaseSwapChainResources()

{ return S_OK;

}

#6.11

Page 97: Direct3D11  KickStart

DxaMeshCam.cppvoid Dxa::MeshCam::animate(double dt, double t)

{camera.FrameMove(dt);

}bool Dxa::MeshCam::processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{return camera.HandleMessages(hWnd, uMsg, wParam, lParam);

}

#6.12

Page 98: Direct3D11  KickStart

DxaMeshCam.cppvoid Dxa::MeshCam::render(ID3D11DeviceContext* context)

{float clearColor[4] = { 0.3f, 0.2f, 0.9f, 0.0f };ID3D11RenderTargetView* defaultRtv = DXUTGetD3D11RenderTargetView();ID3D11DepthStencilView* defaultDsv = DXUTGetD3D11DepthStencilView();context->ClearRenderTargetView( defaultRtv, clearColor );context->ClearDepthStencilView( defaultDsv, D3D11_CLEAR_DEPTH, 1.0, 0 );// insert next slides here

}

#6.13

Page 99: Direct3D11  KickStart

DxaMeshCam.cppD3DXMATRIX modelMatrix, modelMatrixInverse;

D3DXMatrixIdentity(&modelMatrix);D3DXMatrixInverse(&modelMatrixInverse, NULL, &modelMatrix);

D3DXMATRIX viewMatrix = *camera.GetViewMatrix();

D3DXMATRIX projMatrix = *camera.GetProjMatrix();

D3DXMATRIX modelViewProjMatrix = modelMatrix * viewMatrix * projMatrix;

#6.14

Page 100: Direct3D11  KickStart

DxaMeshCam.cppcontext->IASetInputLayout(inputLayout);

effect->GetTechniqueByName("basic")->GetPassByName("basic")->Apply(0, context);

mesh->draw(context);

#6.16

Page 101: Direct3D11  KickStart

Itt tartunk – mozgó kamerával

Page 102: Direct3D11  KickStart

Textúrázás

Dxa::Textured

Page 103: Direct3D11  KickStart

Új osztály: Dxa::Textured

• Dxa::MeshCam lemásolva• MeshCam -> Textured search&replace• basic.fx helyett textured.fx betöltése

Page 104: Direct3D11  KickStart

fx/textured.fx#include technique11 basic

Texture2D kdTexture;

SamplerState linearSampler{Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap;};

#7.0

Page 105: Direct3D11  KickStart

fx/textured.fxfloat4 psTextured(VsosTrafo input) : SV_Target{return abs(saturate(input.normal).y) * kdTexture.Sample(linearSampler, input.tex);

}

technique11 textured{pass textured{SetVertexShader ( CompileShader( vs_5_0, vsTrafo() ) );SetPixelShader( CompileShader( ps_5_0, psTextured() ) );}

}

#7.1

Page 106: Direct3D11  KickStart

KickStart11.cpp#include "DxaTextured.h"

#8.0

Page 107: Direct3D11  KickStart

KickStart11.cppnew//Dxa::MeshCam(pd3dDevice);Dxa::Textured(pd3dDevice);

#8.1

Page 108: Direct3D11  KickStart

DxaTextured.hclass Textured :public Dxa::Base{ID3D11ShaderResourceView* kdTextureSrv;

#8.2

Page 109: Direct3D11  KickStart

DxaTextured.cppHRESULT Dxa::Textured::createResources(){. . .

D3DX11CreateShaderResourceViewFromFile( device, L"Media/uvGrid.jpg", NULL,

NULL, &kdTextureSrv, NULL);

return S_OK;}

#8.3

Page 110: Direct3D11  KickStart

DxaTextured.cppHRESULT Dxa::Textured::releaseResources()

{kdTextureSrv->Release();

#8.4

Page 111: Direct3D11  KickStart

InputLayout

• átírhatnánk az input layoutot hogy a textured|textured pass-t alapján jöjjön létre– most a basic|basic alapján van– de a kettőben tökugyanaz a VS

Page 112: Direct3D11  KickStart

DxaTextured.cppD3DX11_PASS_DESC basicPassDesc;effect->GetTechniqueByName("textured")->GetPassByName("textured")->GetDesc(&basicPassDesc);

mesh->createInputLayout(device, &basicPassDesc, &inputLayout);

#8.5

Page 113: Direct3D11  KickStart

DxaTextured.cppeffect->GetVariableByName("kdTexture")->AsShaderResource()->SetResource(kdTextureSrv);

context->IASetInputLayout(inputLayout);

effect->GetTechniqueByName("textured")->GetPassByName("textured")->Apply(0, context);

mesh->draw(context);

#8.6

Page 114: Direct3D11  KickStart

Kész – textúrázott nyúl

Page 115: Direct3D11  KickStart

Environment mapping

Dxa::EnvMapped

Page 116: Direct3D11  KickStart

Szokásos lépések

• DxaTextured -> DxaEnvMapped• KickStart.cpp-be include és példány létrehozás• textured.fx helyett envmapped.fx• textured|textured pass helyett– envmapped technique• background pass• envmapped pass

Page 117: Direct3D11  KickStart

fx/envmapped.fx#include "textured.fx"

float3 eyePos;TextureCube envTexture;

float4 psEnvMapped(VsosTrafo input) : SV_Target{

float3 viewDir = normalize(input.worldPos - eyePos);float3 reflectionDir = reflect(viewDir, input.normal);return 0.5 * envTexture.Sample(linearSampler, reflectionDir) + 0.5 * kdTexture.Sample(linearSampler, input.tex);

}

technique11 envmapped{

pass envmapped{SetVertexShader ( CompileShader( vs_5_0, vsTrafo() ) );SetPixelShader( CompileShader( ps_5_0, psEnvMapped() ) );}

}

#9.0

Page 118: Direct3D11  KickStart

DxaEnvMapped.hclass EnvMapped :public Dxa::Base{ID3D11ShaderResourceView* envTextureSrv;

#10.0

Page 119: Direct3D11  KickStart

DxaEnvMapped.cpp// createResources

D3DX11CreateShaderResourceViewFromFile( device, L"Media/cloudyNoon.dds", NULL, NULL, &envTextureSrv, NULL);return S_OK;

}

// releaseResourcesenvTextureSrv->Release();

#10.1

Page 120: Direct3D11  KickStart

DxaEnvMapped.cppeffect->GetVariableByName("eyePos")->AsVector()->SetFloatVector((float*)camera.GetEyePt());

effect->GetVariableByName("envTexture")->AsShaderResource()->SetResource(envTextureSrv);

effect->GetVariableByName("kdTexture")->AsShaderResource()->SetResource(kdTextureSrv);

context->IASetInputLayout(inputLayout);effect->GetTechniqueByName("envmapped")->GetPassByName("envmapped")->Apply(0, context);

mesh->draw(context);

#10.2

Page 121: Direct3D11  KickStart

Env map tükröződés kész

Page 122: Direct3D11  KickStart

Látsszon a környezet a háttérben

• full-viewport quad– új mesh– Mesh::createQuad

• minden pixel olyan színű amilyen irányban látszik– vsQuad– psBackground– envmapped|background pass

• backgroundInputLayout

Page 123: Direct3D11  KickStart

fx/envmapped.fxstruct IaosQuad{float4 pos: POSITION;float2 tex: TEXCOORD0;

};

struct VsosQuad{float4 pos: SV_POSITION;float2 tex: TEXCOORD0;float3 viewDir: TEXCOORD1;

};

#11.0

Page 124: Direct3D11  KickStart

fx/envmapped.fxfloat4x4 eyeViewProjMatrixInverse;

VsosQuad vsQuad(IaosQuad input){VsosQuad output = (VsosQuad)0;

output.pos = input.pos; float4 hWorldPosMinusEye = mul(input.pos, eyeViewProjMatrixInverse);

hWorldPosMinusEye /= hWorldPosMinusEye.w; output.viewDir = hWorldPosMinusEye.xyz;output.tex = input.tex;

return output;};

#11.1

Page 125: Direct3D11  KickStart

fx/envmapped.fxtechnique11 envmapped{

pass envmapped{SetVertexShader ( CompileShader( vs_5_0, vsTrafo() ) );SetPixelShader( CompileShader( ps_5_0, psEnvMapped() ) );}pass background{SetVertexShader ( CompileShader( vs_5_0, vsQuad() ) );SetPixelShader( CompileShader( ps_5_0, psBackground() ) );}

}

#11.1

Page 126: Direct3D11  KickStart

DxaEnvMapped.hclass EnvMapped :public Dxa::Base{Mesh* backgroundQuad;ID3D11InputLayout* backgroundInputLayout;

#12.3

Page 127: Direct3D11  KickStart

DxaEnvMapped.cpp//createResourcesMesh::createQuad(device, &backgroundQuad);

D3DX11_PASS_DESC backgroundPassDesc;effect->GetTechniqueByName("envmapped")->GetPassByName("background")->GetDesc(&backgroundPassDesc);

backgroundQuad->createInputLayout(device, &backgroundPassDesc, &backgroundInputLayout);

#12.4

Page 128: Direct3D11  KickStart

DxaEnvMapped.cppHRESULT Dxa::EnvMapped::releaseResources()

{delete backgroundQuad;backgroundInputLayout->Release();

#12.5

Page 129: Direct3D11  KickStart

DxaEnvMapped.cpp// renderD3DXMATRIX eyeMatrix;D3DXMatrixTranslation(&eyeMatrix, camera.GetEyePt()->x,

camera.GetEyePt()->y, camera.GetEyePt()->z);D3DXMATRIX eyeViewProjMatrix = eyeMatrix * viewMatrix *

projMatrix;D3DXMATRIX eyeViewProjMatrixInverse;D3DXMatrixInverse(

&eyeViewProjMatrixInverse, NULL, &eyeViewProjMatrix);effect->

GetVariableByName("eyeViewProjMatrixInverse")->AsMatrix()->SetMatrix((float*)&eyeViewProjMatrixInverse);

#12.6

Page 130: Direct3D11  KickStart

DxaEnvMapped.cpp//rendercontext->

IASetInputLayout(backgroundInputLayout);

effect->GetTechniqueByName("envmapped")->GetPassByName("background")->Apply(0, context);

backgroundQuad->draw(context);

#12.7

Page 131: Direct3D11  KickStart

Environment map kész

Page 132: Direct3D11  KickStart

Folyt. köv.

• GUI• Asset import• Instancing• Render to texture• Geometry shader• Stream output• Tessellator


Top Related