Számítógépes grafika
This presentation is the property of its rightful owner.
Sponsored Links
1 / 99

Számítógépes grafika PowerPoint PPT Presentation


  • 74 Views
  • Uploaded on
  • Presentation posted in: General

Számítógépes grafika. DirectX 3. gyakorlat. Emlékeztető. Rajzoltunk múlt órán üres ablakot, képet, szöveget Ehhez megismerkedtünk a Direct3D Object-tel és a Direct3D Device-szal Textúrabetöltést is megismertük. Tartalom. 1. Áttekintés 2. Háromdimenziós alapok 3. CG. Jelenlegi programváz.

Download Presentation

Számítógépes grafika

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Sz m t g pes grafika

Számítógépes grafika

DirectX

3. gyakorlat


Sz m t g pes grafika

Emlékeztető

  • Rajzoltunk múlt órán üres ablakot, képet, szöveget

  • Ehhez megismerkedtünk a Direct3D Object-tel és a Direct3D Device-szal

  • Textúrabetöltést is megismertük


Sz m t g pes grafika

Tartalom

  • 1. Áttekintés

  • 2. Háromdimenziós alapok

  • 3. CG


Sz m t g pes grafika

Jelenlegi programváz

  • A videókártya memóriájába kerülő erőforrások lefoglalása

InitDeviceObjects

  • A Direct3D Object létrehozása

  • A Direct3DDevice objektum létrehozása

  • olyan erőforrások lefoglalása, amik nem a videókártya memóriájába kerülnek

InitD3D


Sz m t g pes grafika

Jelenlegi programváz

FrameUpdate

Render

- A színtér felépítésének módosítása, különböző mátrixok beállítása (nézeti, projekciós) stb.

- A színtér kirajzolása


Sz m t g pes grafika

Jelenlegi programváz

A videókártya memóriájába kerülő erőforrások felszabadítása

ReleaseDeviceObjects

  • A Direct3D Device megsemmisítése

  • A Direct3D Object megsemmisítése

  • Az erőforrások felengedése, amelyek nem a videókártya memóriájába kerültek

CleanUpD3D


Sz m t g pes grafika

Jelenlegi programváz

InitDeviceObjects

ReleaseDeviceObjects

FrameUpdate

Render

InitD3D

CleanUpD3D


Sz m t g pes grafika

CDXAppBase

  • Az ősosztály

  • Tartalmazza a WinAPI-s ablaklétrehozás kódját

  • Adattagjai között szerepel egy-egy D3D Object, Device, Presentation Parameters


Sz m t g pes grafika

CDX*App

  • Ezeket írjuk mi, múlt órán például CDXImageApp stb.

  • A következő függvényeket kell megvalósítani benne:

    HRESULTInitD3D();

    HRESULTInitDeviceObjects();

    VOIDReleaseDeviceObjects();

    VOIDCleanUpD3D();

    VOIDFrameUpdate();

    VOIDRender();


Sz m t g pes grafika

CDX*App.h

#pragmaonce

#include "dxappbase.h"

class CDX*App : public CDXAppBase

{

public:

CDX*App(void);

~CDX*App(void);

HRESULTInitD3D();

HRESULTInitDeviceObjects();

VOIDReleaseDeviceObjects();

VOIDCleanUpD3D();

VOIDFrameUpdate();

VOIDRender();

...


Sz m t g pes grafika

main.cpp

  • Létrehoz a CDX*App-unkból egy objektumot

  • Meghívja annak az ablaklétrehozó eljárását

  • És a Run futattóeljárását

  • A Run

    • Kezeli a Windows-os üzeneteket (kattintások, átméretezések stb.)

    • Ha épp nincs feldolgozandó üzenet, akkor a Render-t meghívja (a Render-ben pedig mi FrameUpdate-et is hívunk)


Sz m t g pes grafika

CDXAppBase::Run

VOID CDXAppBase::Run()

{

MSG msg;

ZeroMemory( &msg, sizeof(msg) );

while( msg.message!=WM_QUIT )

{

if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )

{

TranslateMessage( &msg );

DispatchMessage( &msg );

}

else

Render();

}

}


Sz m t g pes grafika

Tartalom

  • 1. Áttekintés

  • 2. Háromdimenziós alapok

  • 3. CG


Sz m t g pes grafika

Primitívek

  • A 3D-s modelljeinket primitívekből, építőelemekből rakjuk össze

  • Egy 3D-s primitív csúcspontokból áll, amik egyetlen térbeli entitást alkotnak

  • Például pontok, poligonok stb.


Sz m t g pes grafika

Pipeline

Vertex shader

Fragment

shader


Sz m t g pes grafika

Direct3D primitívjei

  • Ha tudjuk, hogy milyen típusú primitívet szeretnénk rajzolni, akkor onnantól már csak a pontjait kell megadni

  • Ugyanis a 3D-s entitást a primitívtípusból és az azt jellemző pontösszekötési szabályból a csúcspontok már meghatározzák


Sz m t g pes grafika

Direct3D primitívjei

  • Legyenek adottak a következő csúcsok:

    struct CUSTOMVERTEX { float x,y,z;};

    CUSTOMVERTEX Vertices[] = {

    {-5.0,-5.0,0.0}, {0.0,5.0,0.0},

    {5.0,-5.0,0.0}, {10.0,5.0,0.0},

    {15.0,-5.0,0.0}, {20.0,5.0,0.0}

    };


Sz m t g pes grafika

Direct3D primitívjeiPontlisták

  • A bemeneti csúcspontokat különálló pontokként rendereli le

  • Anyagjellemzőket és textúrákat rendelhetőek hozzájuk

  • d3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 6 );


Sz m t g pes grafika

Direct3D primitívjeiSzakaszlisták

  • Különálló szakaszok, 2*n és 2*n+1-edik pont között

  • Páros számú pontot kell megadni

  • d3dDevice->DrawPrimitive( D3DPT_LINELIST, 0, 3 );


Sz m t g pes grafika

Direct3D primitívjeiLinestrip

  • Csatlakozó szakaszsorozat, legalább két pontot meg kell adni

  • d3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, 5 );


Sz m t g pes grafika

Direct3D primitívjeiHáromszög lista

  • Különálló háromszögek listája, 3*n pontot kell megadni

  • d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );


Sz m t g pes grafika

Direct3D primitívjeiHáromszög strip

  • Egy oldalban csatlakozó háromszögek listája

  • Legalább 3 pontot kell megadni, utána minden újabb pont az előző kettővel együtt alkot egy háromszöget

  • d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4);


Sz m t g pes grafika

Direct3D primitívjeiHáromszög „legyező” (fan)

  • Hasonló mint az előző, csak mindegyik háromszögnek van egy közös pontja

  • d3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 4 );


Sz m t g pes grafika

Vertexek

  • A csúcspontokat (vertexeket) vertex bufferekben tároljuk

  • A vertex bufferek pedig erőforrások


Sz m t g pes grafika

Erőforrások DirectX-ben

  • Minden erőforrás bír a következő tulajdonságokkal:

    • Usage: felhasználási mód, például textúra, vagy renderelési célpont stb.

    • Format: adatformátum (pl. surface-nél bitmélység)

    • Pool: a memóriatípus, ahová kerül

    • Type: típus, vertex buffer, render cél stb.


Sz m t g pes grafika

Erőforrások DirectX-benUsage

  • Az alkalmazásnak már az erőforrás létrehozásakor meg kell mondania, hogy milyen módon fogja azt használni

  • Lehetséges értékeit ld. D3DUSAGE

  • Például pontsprite-okat tartalmazó vertex (és index) buffernek D3DUSAGE_POINTS-ot kell megadnia

  • D3DUSAGE_WRITEONLY-val azt mondjuk, hogy csak írni fogjuk az adott vertex buffert. Ez lényegesen gyorsíthat!


Sz m t g pes grafika

Erőforrások DirectX-benFormat

  • Az erőforrás tárolási formátumát adja meg

  • D3DFORMAT-ban találhatóak a lehetséges értékei

  • Az erőforrás típusától függnek a megengedett értékek

  • Mások tehát back bufferekhez, bufferekhez, megjelenítési felületekhez stb.


Sz m t g pes grafika

Erőforrások DirectX-benPool

  • Ez határozza meg, hogy az adott erőforrás hová kerül (videókártya-memória, rendszermemória stb.)

  • Nem változtatható meg futás során

  • Értékeihez ld. D3DPOOL


Sz m t g pes grafika

Memóriaosztályok 1/2

  • D3DPOOL_DEFAULT: az adott erőforrás a felhasználása szerinti legjobb helyen kerül tárolásra. Ez túlnyomórészt a videókártya memóriája.

  • D3DPOOL_MANAGED: amint szükséges a videókártya által is elérhető memóriába másolódnak az így definiált erőforrások. Emellett mindig van egy másolat róluk a rendszermemóriában. Nem kell helyreállítani őket lost device-nál.


Sz m t g pes grafika

Memóriaosztályok 2/2

  • D3DPOOL_SYSTEMMEM: rendszermemória (RAM), általában az így elhelyezett dolgok nem érhetőek el a Direct3D Device által. Lost device nem érinti őt sem.

  • D3DPOOL_SCRATCH: hasonló mint a fenti, de rájuk nem vonatkoznak a device képességeiből fakadó megkötések (méret, formátum stb.). Device nem érheti el őket.


Sz m t g pes grafika

Erőforrások DirectX-benType

  • A típus futásidőben derül ki az erőforrást létrehozó eljárástól függően, implicit módon

  • Pl. a IDirect3DDevice9::CreateTexture textúrát hoz létre


Sz m t g pes grafika

Erőforrások DirectX-benMűveletek erőforrásokkal

  • A színtér kirajzolása közben különböző műveleteket végzünk az erőforrásainkon

  • Pl. létrehozzuk őket (device-on keresztül vagy D3DXCreateXXX-el, ...)

  • A tárolt adatok elérését lock-nak hívjuk

  • Például:

    • textúra képpontjainak elérése: IDirect3DTexture9::LockRect

    • Vertex bufferek csúcsainak elérése: IDirect3DVertexBuffer9::Lock


Sz m t g pes grafika

Erőforrások DirectX-benLock

  • Egy erőforrás lock-olása azt jelenti, hogy hozzáférést biztosítunk a CPU-nak a tárolt adatokhoz

  • A lock-olás során különböző flag-ek beállításával mondjuk meg, hogy miként szeretnénk használni a megszerzett adatokat:

    • D3DLOCK_DISCARD

    • D3DLOCK_READONLY

    • ...


Sz m t g pes grafika

Erőforrások DirectX-benLock

  • Egy erőforráson egyszerre csak egy lock lehet

  • A lockolás visszaad egy struktúrát is, ami azt jellemzi, hogy miként tárolódik fizikailag az adott erőforrás a memóriában


Sz m t g pes grafika

Erőforrások DirectX-benUnlock

  • Miután elvégeztük a dolgunkat a bufferrel Unlock-olni kell!


Sz m t g pes grafika

Erőforrások DirectX-benVertex bufferek

  • IDirect3DVertexBuffer9 interfész

  • Vertexadatokat tartalmazó memóriaterület

  • A benne tárolt csúcsok transzformálhatóak, világíthatóak stb.

  • De tárolhatunk már eleve transzformált pontokat (RHW)

  • Egy vertex buffert a képességei írnak le

    • amiket egy D3DVERTEXBUFFER_DESC struktúra ad meg


Sz m t g pes grafika

Flexible Vertex Format

  • Nem akarunk mindig minden csúcsponttal minden lehetséges dolgot megcsinálni

  • Vannak olyan pontok amikre pl. csak egy textúrát akarunk feszíteni, esetleg nem akarjuk megvilágítani

  • Az FVF segítségével mondhatjuk meg, hogy az aktuális vertex bufferben tárolt csúcsokkal mit szeretnénk kezdeni


Sz m t g pes grafika

Flexible Vertex Format

  • D3DFVF_XYZ: 3D koordináták

  • D3DFVF_XYZRHW: transzformált képpont

  • D3DFVF_NORMAL: normálvektora is lesz (megvilágításhoz)

  • D3DFVF_DIFFUSE, D3DFVF_SPECULAR : csúcs színe

  • ...


Sz m t g pes grafika

Flexible Vertex Format

  • Létrehozunk egy struktúrát a programunk számára a csúcspont adatait leírni, illetve egy #define-al megadjuk Direct3D-nek a használt FVF tulajdonságokat

  • Fontos, hogy a struct-ban az adattagok sorrendje a D3DFVF_... konstansok sorrendjében kövesse egymást

    • Tehát általában pozíció, normális, szín, textúrakoordináták sorrendben jöjjenek


Sz m t g pes grafika

Flexible Vertex Format

struct CUSTOMVERTEX

{

FLOAT x, y, z;

DWORD color;

};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)


Sz m t g pes grafika

1. példa

Primitívek


Sz m t g pes grafika

Mit használunk?

  • Az eredmény ez lesz: http://people.inf.elte.hu/valasek/bevgraf/03/02_Vertices.zip


Sz m t g pes grafika

Új adattag

class CDXVerticesApp :public CDXAppBase

{

...

private:

LPDIRECT3DVERTEXBUFFER9 m_pVB;

};


Sz m t g pes grafika

FVF deklarációDXVerticesApp.cpp

A programunkban az eltárolt csúcspontokat így látjuk, ezeken az adattagokon keresztül

struct CUSTOMVERTEX

{

FLOAT x, y, z, rhw;

DWORD color;

};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

A videókártya számára ezzel a kifejezéssel mondjuk meg, hogy a vertex bufferben eltárolt adatok csúcspontelemei milyen attribútumait írják le egy-egy pontnak


Sz m t g pes grafika

Mit fogunk tenni?

  • Létrehozunk egy 3 elemű tömböt aminek az elemei CUSTOMVERTEX típusúak

  • Létrehozunk egy vertex buffert

  • Áttöltjük az adatokat a vertexbufferbe

    • ehhez a korábban említett lock – unlock segítségét vesszük igénybe

  • A VB-t DEFAULT_POOL-ba tesszük


Sz m t g pes grafika

HRESULT CDXVerticesApp::InitDeviceObjects()

HRESULT CDXVerticesApp::InitDeviceObjects()

{

CUSTOMVERTEX vertices[] =

{ { 256.0f, 0.0f, 0.5f, 1.0f, 0xffff0000 }, { 512.0f, 396.0f, 0.5f, 1.0f, 0xff00ff00 }, { 0.0f, 396.0f, 0.5f, 1.0f, 0xff0000ff }};

...

x

y

z

w

A szín, lehet D3DCOLOR_* makró is


Sz m t g pes grafika

HRESULT CDXVerticesApp::InitDeviceObjects()

...

HRESULT hr = m_pD3DDevice-> CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL );

...


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • Length: a buffer nagysága bájtban; legalább egy vertex tárolására elég kell, hogy legyen


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • Usage: lehet 0, egyébként ugyanaz mint eddig.


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • FVF: a használni kívánt FVF


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • Pool: memóriaosztály


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • ppVertexBuffer: kimeneti érték


Sz m t g pes grafika

IDirect3DDevice9::CreateVertexBuffer

  • HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle );

  • pSharedHandle: legyen NULL


Sz m t g pes grafika

HRESULT CDXVerticesApp::InitDeviceObjects()

...

VOID*pVertices;

if( FAILED( m_pVB->Lock( 0,sizeof(vertices),&pVertices,

0 ) ) ) return E_FAIL;

memcpy(pVertices, vertices,sizeof(vertices) );

m_pVB->Unlock();

...


Sz m t g pes grafika

IDirect3DVertexBuffer9::Lock

  • HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, VOID ** ppbData, DWORD Flags );

  • OffsetToLock: a vertexbuffer kezdetéhez képest hány bájttal kezdődően lock-oljunk


Sz m t g pes grafika

IDirect3DVertexBuffer9::Lock

  • HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, VOID ** ppbData, DWORD Flags );

  • SizeToLock: hány bájtnyi vertexadatot lockoljunk


Sz m t g pes grafika

IDirect3DVertexBuffer9::Lock

  • HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, VOID ** ppbData, DWORD Flags );

  • ppbData: kimeneti érték, mutató egy memóriabuffer címére ahová a visszaadott adatokat másolja


Sz m t g pes grafika

IDirect3DVertexBuffer9::Lock

  • HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, VOID ** ppbData, DWORD Flags );

  • Flags: milyen típusú lock-ot akarunk:

    • D3DLOCK_DISCARD: üres adatokat kapunk vissza

    • D3DLOCK_READONLY: csak olvasni

    • stb.


Sz m t g pes grafika

HRESULT CDXVerticesApp:: ReleaseDeviceObjects()

VOID CDXVerticesApp::ReleaseDeviceObjects()

{

if( m_pVB != NULL )

m_pVB->Release();

}


Sz m t g pes grafika

VOID CDXVerticesApp::Render()

... // színtér renderelése

m_pD3DDevice-> SetStreamSource(0,

m_pVB,

0,

sizeof(CUSTOMVERTEX));


Sz m t g pes grafika

IDirect3DDevice9::SetStreamSource

  • HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 * pStreamData, UINT OffsetInBytes, UINT Stride );

  • StreamNumber: a folyam sorszáma 0-tól maxstream-1-ig


Sz m t g pes grafika

IDirect3DDevice9::SetStreamSource

  • HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 * pStreamData, UINT OffsetInBytes, UINT Stride );

  • pStreamData: mutató egy vb interfészre


Sz m t g pes grafika

IDirect3DDevice9::SetStreamSource

  • HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 * pStreamData, UINT OffsetInBytes, UINT Stride );

  • OffsetInBytes: a stream és a vertexadat kezdete közti eltérés, bájtban


Sz m t g pes grafika

IDirect3DDevice9::SetStreamSource

  • HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 * pStreamData, UINT OffsetInBytes, UINT Stride );

  • Stride: mekkora „léptékben” olvassa ki a vertexbufferből az adatokat


Sz m t g pes grafika

VOID CDXVerticesApp::Render()

...

m_pD3DDevice-> SetFVF(D3DFVF_CUSTOMVERTEX);

m_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST,

0,

1);

...


Sz m t g pes grafika

IDirect3DDevice9::SetFVF

  • HRESULT SetFVF( DWORD FVF );

  • Az aktuális vertex streamhez használandó FVF-t adja meg


Sz m t g pes grafika

IDirect3DDevice9::DrawPrimitive

  • HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );

  • PrimitiveType: milyen típusú primitív rajzolásához való vertexeket adtunk meg (pontlista, szakaszlista, stbÖ


Sz m t g pes grafika

IDirect3DDevice9::DrawPrimitive

  • HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );

  • StartVertex: a vertexbuffer hányadik eleme legyen az első csúcspontja a primitívnek (azt, hogy egy csúcspont mekkora helyet foglal, a stride-ból tudja)


Sz m t g pes grafika

IDirect3DDevice9::DrawPrimitive

  • HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );

  • PrimitiveCount: a kirajzolandó primitívek száma. Ld. primitíveknél, hogy ilyenkor mennyi csúcspontnak kell legalább lennie a vb-ben.


Sz m t g pes grafika

Tartalom

  • 1. Áttekintés

  • 2. Háromdimenziós alapok

  • 3. CG


Mire lesz sz ks g nk

Mire lesz szükségünk

  • CG toolkit: http://developer.nvidia.com/object/cg_download.html


C for graphics

C for Graphics

  • A CG-t az NVidia fejlesztette az évezred elején (MS is részt vett ebben)

  • 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 for graphics adatt pusok

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 pusok1

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

C for Graphics műveletek

  • Vektorműveletek

    • dot, cross stb.

  • Egyéb:

    • lerp(a, b, w): lineáris interpoláció


Sz m t g pes grafika

2. példa

Shader alapprogram


Sz m t g pes grafika

Kiindulás

  • Az előzőhöz hasonló programot írunk

  • A Visual Studionak ugyanúgy be kell állítani a Tools/Options-ben a CG include és lib könyvtárait, mint a DirectX-nek

  • http://people.inf.elte.hu/valasek/bevgraf/03/03_Shaders.zip


Dxmyapp h

DXMyApp.h

#pragmacomment(lib, "cgD3D9.lib")

#pragmacomment(lib, "cg.lib")

#include <Cg/Cg.h>

#include <Cg/CgD3D9.h>

...


Dxmyapp h1

DXMyApp.h

class CDXMyApp : public CDXAppBase

{ ...

private:

LPDIRECT3DVERTEXBUFFER9 m_pVB;

CGcontext m_CGcontext;

CGprogram m_CGprogram_vertex;

CGprogram m_CGprogram_pixel;

CGparameter m_CGparam_color;

...


Dxmyapp h2

DXMyApp.h

...

staticconst DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

struct Vertex{

D3DXVECTOR3 p;

DWORD c;};

};


Cg v ltoz k

CG változók

  • cgContext: a CG programok (shaderek) tárolójaként tekinthetünk rá

  • cgProgram: egy CG program (shader)

  • cgParameter: egy CG program paramétere, amit az alkalmazásból állíthatunk


Megjelen t s a grafikus hardveren

Megjelenítés a grafikus hardveren


Cdxmyapp cdxmyapp

CDXMyApp::CDXMyApp()

CDXMyApp::CDXMyApp(void)

{

m_pVB = NULL;

}


Cdxmyapp initdeviceobjects

CDXMyApp::InitDeviceObjects()

HRESULTCDXMyApp::InitDeviceObjects()

{

Vertex quadVertices[] =

{

{ D3DXVECTOR3(0,1,0),0xffff0000},

{ D3DXVECTOR3(1,-1,0),0xff00ff00},

{ D3DXVECTOR3(-1,-1,0),0xff00ff00},

};

...


Cdxmyapp initdeviceobjects1

CDXMyApp::InitDeviceObjects()

...

m_pD3DDevice->CreateVertexBuffer( sizeof(quadVertices), D3DUSAGE_WRITEONLY, FVF, D3DPOOL_DEFAULT, &m_pVB, NULL );

void *pVertices = NULL;

m_pVB->Lock(0,sizeof(quadVertices), &pVertices, 0 );

memcpy(pVertices,quadVertices,sizeof(quadVertices));

m_pVB->Unlock();

...


Cdxmyapp initdeviceobjects2

CDXMyApp::InitDeviceObjects()

...

m_CGcontext = cgCreateContext();

cgD3D9SetDevice( m_pD3DDevice );

CGprofile vertexProfile = cgD3D9GetLatestVertexProfile();

CGprofile pixelProfile = cgD3D9GetLatestPixelProfile();

...


Cdxmyapp initdeviceobjects3

CDXMyApp::InitDeviceObjects()

A shaderünk fordításának beállításai, ezzel kérjük le, hogy az elérhető legjobb verzióra történjen a fordítás

...

const char **vertexOptions[] =

{

cgD3D9GetOptimalOptions( vertexProfile ),

NULL,

};

const char **pixelOptions[] =

{

cgD3D9GetOptimalOptions( pixelProfile ),

NULL,

};

...


Cdxmyapp initdeviceobjects4

CDXMyApp::InitDeviceObjects()

Hogyan hozzuk létre a shadert:CG_SOURCE: forrásfájlbólCG_OBJECT: lefordított objektum kódból

...

m_CGprogram_vertex = cgCreateProgramFromFile(

m_CGcontext,

CG_SOURCE,

"vs.cg",

vertexProfile,

"main",

*vertexOptions );

...

Context amibe rakjuk a shadert

Fordítandó shader fájlneve

Fordítási cél shader modell

A shader belépési pontja

Compiler opciók


Cdxmyapp initdeviceobjects5

CDXMyApp::InitDeviceObjects()

...

m_CGprogram_pixel = cgCreateProgramFromFile(

m_CGcontext,

CG_SOURCE,

"ps.cg",

pixelProfile,

"main",

*pixelOptions );

...


Cdxmyapp initdeviceobjects6

CDXMyApp::InitDeviceObjects()

Melyik shadert töltsük be

Engedélyezzük-e a parameter shadowing-ot

Fordítási flagek, lásd D3DXAssembleShader

Shader változó kinyerése az alkalmazás számára (shader, változónév)

...

cgD3D9LoadProgram( m_CGprogram_vertex, FALSE, 0 );

cgD3D9LoadProgram( m_CGprogram_pixel, FALSE, 0 );

m_CGparam_color = cgGetNamedParameter( m_CGprogram_pixel, "cl" );

m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);

m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

return S_OK;

}


Cdxmyapp releasedeviceobjects

CDXMyApp::ReleaseDeviceObjects()

VOIDCDXMyApp::ReleaseDeviceObjects()

{

cgD3D9SetDevice(NULL);

cgDestroyProgram(m_CGprogram_vertex);

cgDestroyProgram(m_CGprogram_pixel);

cgDestroyContext(m_CGcontext);

if( m_pVB != NULL )

{

m_pVB->Release();

m_pVB = NULL;

}

}


Cdxmyapp render

CDXMyApp::Render()

...

m_pD3DDevice->SetFVF(FVF);

D3DXVECTOR4 vConstColor( 0.4f, 1.0f, 0.7f, 0.0f );

cgD3D9SetUniform( m_CGparam_color, &vConstColor );

cgD3D9BindProgram( m_CGprogram_vertex );

cgD3D9BindProgram( m_CGprogram_pixel );

m_pD3DDevice->SetStreamSource( 0, m_pVB, 0, sizeof(Vertex) );

m_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

...


Vs cg

vs.cg

struct vertexIn

{

float3 p : POSITION;

float4 c : COLOR0;

};

struct hvertexOut

{

float4 p : POSITION;

float4 c : COLOR0;

};


Vs cg1

vs.cg

hvertexOut main( vertexIn IN )

{

hvertexOut OUT;

out.p = float4( IN.p.x, IN.p.y,IN.p.z, 1 );

OUT.c = IN.c;

return OUT;

}


Ps cg

ps.cg

struct fragment

{

float4 p: POSITION;

float4 c: COLOR0;

};

struct pixel

{

float4 c: COLOR;

};


Ps cg1

ps.cg

pixel main( fragment IN, uniformfloat4 cl)

{

pixel OUT;

OUT.c = IN.c;

return OUT;

}


Feladat

Feladat

  • Az idő függvényében változtassuk a háromszög színét

  • Mossuk át zöld színre a háromszöget, folyamatosan oda-vissza!


  • Login