|
|
Nvm.
Ezt a hozzászólást Elodin módosította (2017.07.05 09:03 GMT+1 óra, 593 nap)
|
|
|
Azt maximum az nvidia optimus-on keresztül (ha van kivezetett api-ja)
|
|
|
A kérdés az volt inkább, hogy tudom e direktbe befolyásolni, hogy melyik videokari kapja meg az outputot.
Úgy tűnik nem, a driverek nem engednek ezzel magic-elni.
|
|
|
Megkérdeztem egy dx11 expert kollégát, ő is azon az állásponton van, mint én. Két vidkari van, de csak egy kimenet, szóval egyszerre nem tudod használni mind a két vidkarit (ezért nem ad vissza outputot).
|
|
|
Mindkét videokari ugyanazt a monitort használja (jelen esetben a laptop screen-jét).
Ha nvidia control panel-ba állítok, vagy jobb gomb az exe-n, és futtatás grafikus processzorral gombbal indítom a játékot, akkor tudok is váltani integrált és dedikált kártya között, és minden működik faszán.
DE. Mivel a userek 90%-ának ez már gondot okoz, egyrészt szeretném megbecsülni, hogy melyik a jobb kártya, és app-on belül azt kiválasztani, másrészt ingame option menu-be választhatóvá tenni (ami nyílván restart után érvényesül).
Csakhogy: amikor a zseniális DXGI függvényeket használom, akkor jön a probléma.
Lekérem az adaptereket: IDXGIFactory::EnumAdapters().
Az első király, bármelyik is az.
A másodiknál ha lekérem az output-okat: (IDXGIAdapter::EnumOutputs) nem talál semmit.
Ez azért probléma, mert nem tudom a felbontást screen-hez igazítani, valamint nem tudom eldönteni, hogy tényleges output van e az adapterhez (mint a laptopom esetén), vagy tényleg külön fizikai kimenet van, amire nincs rákötve semmi (mint pl. ahogy te gondolod, hogy van, btw. ez az eset áll fent a PC-m esetén is.)
Edit:
1. Btw vmi magic módon el tudom indítani a pc-n is integrált kártyával a játékot, lesz vagy 6 fps-em, de vhogy átkeveredik a másik videokarin keresztül a monitorra a kép, lol
2. Feladtam a direkt controlt:
https://www.gamedev.net/topic/679029-selecting-the-actual-gpu/
Csak extern-elem a két változót. Nvidia-val teszteltem, így ha az app választhat, akkor a dedikált lesz, ha vki integráltal futtatja, akkor az. Nem a legjobb, de végülis elmegy, ha vki tudja mit csinál, tudja integráltal is futtatni ha akarja.
Ezt a hozzászólást Elodin módosította (2017.05.26 07:27 GMT+1 óra, 633 nap)
|
|
|
Mert ez így nem fog működni. Az output ahogy én értelmezem maga a head, amire ha nincs monitor dugva akkor nincs output sem. Amit leírsz az akkor működik (pl. az irodai gépemen), amikor a diszkrét kártyának IS és az integrált kártyának IS van kimenete, így mindkettőre lehet dugni monitort.
|
|
|
Nincs külön kimenete.
Működik is rendesen a kártya. 860m különben.
Csak a IDXGIAdapter::EnumOutputs nem talál semmit, ha a kártya nem a 0. adapter sloton van.
Ha kívülről "Futtatás grafikus processzorral"-t választok, akkor minden király.
Viszont ha NVidia van a 0-s adapter indexen, és az Intelt próbálom kiválasztani, akkor annak sincs output-ja :/
Ezt a hozzászólást Elodin módosította (2017.05.25 07:41 GMT+1 óra, 634 nap)
|
|
|
Nincs felrakva ilyesmi mint az optimus vagy az amd megfelelője (sose jut eszembe a neve...).
Milyen vidkarikról van szó egyáltalán?
Egy laptopon nekem furcsának tűnik hogy két külön kimenete legyen a két vidkarinak...szerintem a külső monitorod is mindig a primary adapteren fog futni.
|
|
|
Igen. (Laptop).
Ennek nem így kéne történnie ezekszerint?
|
|
|
Van rádugva monitor a másik vidkarira?
|
|
|
Hogy lehet normálisan implementálni a videokártya választást app-on belül?
Ki tudom listázni az adpatereket az IDXGIFactory::EnumAdapters() segítségével.
Viszont amikor az Output-okat nézem ((IDXGIAdapter::EnumOutputs)), mindig csak a 0-s adapteremnek van valid outputja.
Ha kívülről kiválasztom, hogy melyik kártyával szeretném futtatni, akkor szimplán az lesz a 0-ás index-en, és ahhoz fog tartozni az output.
Viszont ha bárhogy is próbálom nem a 0-s adapter-t használni, ahhoz nem tartozik output, és rövid úton crash lesz a vége
|
|
|
Instalok:
Valóban. Ott a pont. Kösz 
Vicces, mert opencl-el szórakoztam ilyennel elég sokat vmi random egyetemi tárgy kapcsán, nem tudom miért kavarodtam most bele
|
|
|
Miért kéne másolni a textúrát?
1. kör:
A-ból olvas
B-be ír
2. kör:
A-ba ír
B-ből olvas
|
|
|
1.) -et úgy képzeled, hogy belerajzolom depth nélkül, majd újra renderelem csak a depth-et, vagy hogy?
Egyébként forward rendering van depth pass nélkül
2.) Necces, mert van egy rakat másik posteffect, meg mert akarom blur-t nyomni a transzparensekre is.
|
|
|
Nem kell külön menteni, több megoldás van:
1) a transzaprenseket is belerajzolod a zbufferbe (ez jelenettől függően 2 depth pass-t jelent, szóval pazarló)
2) a transzparenseket utólag rajzolod ki a depth bufferbe (miután minden opaque effekt lefutott)
|
|
|
Depth of field posteffect problémát akarom fixálni transparent object-ekre úgy, hogy elmentem a tényleges depth-et is transparent objecteknél külön.
Ping-pong-ra gondoltam én is első körben, de sajnos akkor minden írás után másolni kéne a textúrát, az pedig egy kicsit meh-nek hangzik
|
|
|
Legrosszabb esetben shaderben meg lehet csinálni. Persze ez az egész csak akkor értelmes, ha egyetlen csatornád van (pl. shadow map), mert RGB esetén hogy definiálod, hogy "az értéke nagyobb"?
Nomeg az fontos, hogy abba a textúrába írni, amiből olvasol az tudtommal undefined behaviour, szóval double-buffered textúra kell.
|
|
|
Tudok úgy írni textúrába, hogy csak akkor írjak, ha az érték amit írni akarok, nagyobb, mint az eredeti, ami benne volt?
|
|
|
Kedvencem, amikor regressziós hibaként beírják, hogy ami eddig is rossz volt az most máshogy rossz (és emiatt bukik az autotest-jük). Persze, hogy máshogy rossz, újraírtuk az engine-t...
|
|
|
Köszi, közben megtaláltam, mégiscsak maga a textúra volt rossz, csak nem vettem észre, mert más slot-ra került, mint gondoltam.
Nincs is jobb, mint olyan kódon dolgozni, amit már előtte éveken keresztül mások kalapáltak, főleg, ha nincs komolyabb tapasztalatom az adott technológiát illetően
És főleg, ha közben még mások is dolgoznak, tehát ha vmi múlthéten még működött, ma már nem, az nem is feltétlen az én hibám
|
|
|
Textúraformátum? Filtering? Kód?
|
|
|
Próbálok olvasni egy textúrából shaderben, de mindig 0-kat kapok.
A koordináták jók, mert másik textúrából (ugyanakkora) jól olvasok.
A bindolás jó elvileg - visual studio-ban meg tudom nézni, és az van felbindolva, aminek fel kell lennie, a képet is meg tudom nézni, azzal sincs gond.
Bármi elképzelés, hogy mi lehet a gond?
|
|
|
@syam:
Én kérek elnézést
|
|
|
bocs, meg mertem volna esküdni, hogy az opengl topikhoz szólok hozzá O_O
de mindegy, dx-re ugyanez vonatkozik
|
|
|
|
Geri, ez DirectX topic, nincs glu
|
|
|
|
automipmapgeneration esetén - amelyet külön be lehet kapcsolni textúránként egy extension megléte esetén - automatikusan updatelődik. ellenkező esetben neked kell egyesével feltölteni, vagy a glu beépített textúrafeltöltős mipmapgenerációs hülyeségét használva f4eltölteni a textúrát.
|
|
|
Ha van egy textúrám, amibe renderelek, és annak több mipmap szintje van, akkor mi történik a szintekkel?
Mind feltöltődik értelmes értékkel automatikusan, vagy oda külön tudok írni valahogy?
Ha igen, akkor hogy?
Olyat tudok, hogy egy shaderben olvasok egy szintről, és írok egy másikra?
|
|
|
tökéletesen egyetértek parallaxxal. igazából annyi infó és algoritmus van ma már fent neten, hogy akár néhány napon belül is össze lehet rakni egy működőképes, a célnak megfelelő 3d enginet, ha valaki ezt akarja.
|
|
|
Nem feltétlenül igaz az, hogy több idő saját engine, mert más motornak is van egy tanulási ideje főleg, ha még sokat is tud annál bonyolultabb, míg saját engine-t az ember pontosan ismeri és tudja használni, módosítani is külön betanulási idő nélkül. Lehet hogy többet tud más engine, mert univerzálisan mindenkinek meg kell felelnie, míg saját engine-nek csak arra a pár feladatra jó, amire használom ahhoz a következő 3-4 játékhoz., amire nekem éppen kell. Viszont saját engine-nél a tanulási idő szakmailag is tapasztalatot hoz, míg más engine-nél ahol mondjuk az Unreal script megszűnt gyakorlatilag ablakon kidobott fölösleges tudás és elpazarolt idő, amit semmire nem tudok felhasználni.
|
|
|
Saját engine jobb is meg nem is... Jobb mert a képességei csak tőlünk függ és mert a teljes legapróbb részleteiben ismerjük.. Ellenben azért rosszabb amiért egy másik engine használata jobb.. Időt spórol vele az ember és lehet többet tud... Ugyanakkor kitudja hogy miféle algoritmusok futnak alatta és hogy az mennyire hatékony..
|
|
|
Azért elég sok cégnél van saját game engine jelenleg  Valakinek azt is fejlesztenie kell
|
|
|
Már most is még szakmai körökben is egyféle underground területté vált ez és az alacsonyszintű API-kkal méginkább el fog tűnni a programozás, mindenki valami engine-t fog használni.
|
|
|
|
Köszönöm a segítséget. A buffer lekérés volt a hiba, hogy Dx11-esre akartam 10-est rátenni. Ez inkább olyan tanulság, hogy nem hajnali 1-kor csinálok ilyen programot  .
|
|
|
NINJAD!
Kipróbáltam a projektet vs2010-el, debuggolva, nálam is itt akadt el, de nem fagy (win7 alatt)
Kód: if (FAILED(result))
{
DXTRACE_MSG("Failed to get the swapchain backbuffer !");
return false;
}
result = E_NOINTERFACE miatt. (ez az interface nem támogatott.)
Egyébként előtte minden jól ment, dx11 level és hardware-es driver is jó volt.
Én egyébként e szerint csináltam: rastertek, ez megy. Van benne pár extra sor a swapchain flag-eknél:
Kód: // Set the scan line ordering and scaling to unspecified.
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
// Discard the back buffer contents after presenting.
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
// Don't set the advanced flags.
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; // Alt+Enter from fullscr to windowed
De ezzel is ugyanaz van.
Na, csak rájöttem:
rossz:
Kód: result = swapChain_->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&backBufferTexture);
jó:
Kód: result = swapChain_->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferTexture);
Kipróbáltam dx10 level-el, akkor sem jó a 'ID3D10Texture2D'.
|
|
|
@Bennyg: hogy fordul ez nálad egyáltalán?
Kód: dx11demobase.cpp(64): error C2601: 'featureLevels' : local function definitions are illegal
- D3D11_CREATE_DEVICE_DEBUG nem mukodik ha nincs engedelyezve (el is szallt tole ugyh kivettem).
- ez itt miért dx10??
Kód: result = swapChain_->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&backBufferTexture);
kb. ennyi, ezek javítása után müködik. Btw. ezért nem szabad könyvből tanulni... -.-
szerk.: sdf és obj fájlokat ne rakd be a zipbe mert kibaszott nagyok...
Ezt a hozzászólást Asylum módosította (2014.07.16 15:31 GMT+1 óra, ---)
|
|
|
@Dookle: offscreen rendertargetbe renderelj, ne a backbufferrel mókolj mert szarrá hal a driver.
@NaGa: az objektumokat kirajzolod egy egyedi színnel (ami akár egy tömb index vagy pointer is lehet), és visszaolvasod a backbufferből az egér alatt.
|
|
|
Sziasztok !
Mostanában kezdtem bele én is a DirectX11 tanulásába. A példákat az alábbi könyv alapján csinálom: http://ultimategameprogramming.com/
Az alap alkalmazás jól fut és létrejön az ablak is.
Amikor összekötöm a D3D-vel az alábbi 2 kivétellel elszáll a program:
Unhandled exception at 0x76E51D4D (KernelBase.dll) in BlankD3DWindow.exe: 0x0000087D (parameters: 0x00000000, 0x00F1E20C, 0x00F1D644).
majd continue után:
Unhandled exception at 0x654F1F1E (d3d11.dll) in BlankD3DWindow.exe: 0xC0000005: Access violation reading location 0x00000001.
A csatolt fájlban ez a Dx11DemoBase.cpp
bool DX11DemoBase::Initalize(HINSTANCE hInstance, HWND hWnd) meghívásnál történik az alábbi sorban:
result = swapChain_->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&backBufferTexture);
A példákat VS2013 Express for Windows Desktop és Windows 8.1 operációs rendszer alatt fejlesztem.
Ha valaki tud segíteni nagyon hálás lennék.
Segítséget előre is köszönöm.
A projektet itt osztottam meg:
https://onedrive.live.com/redir?resid=8E7574DABEC0E9A!1112&authkey=!APB-ww4wPOgUvl0&ithint=file%2c.zip
|
|
|
Sziasztok! A segítségeteket szeretném kérni abban,hogy hogyan lehetne több 3D Objektumból egyet egér kattintással kiválasztani? Már néztem több példát,de egyik se vált be igazán.
C# Kódrészlet:
Kód: Vector3 near = new Vector3(mouseX, mouseY, 0);
Vector3 far = new Vector3(mouseX, mouseY, 1);
near.Unproject(device.Viewport, device.Transform.Projection, device.Transform.View,device.Transform.World );
far.Unprojectdevice.Viewport, device.Transform.Projection, device.Transform.View,device.Transform.World );
bool intersects = Mesh[i].Intersect(near, far, out closestIntersection);
A válaszotokat előre is köszönöm!
|
|
|
Helló dx9 fullscreen modeban lehet valahogy a backbuffer méretet customra állítani ? Azaz valami olyan értékre amit nem támogat a grafikus kari ?
Elmondom mi a gondom : befejeztem a szép kis 2d játékomat de valahogy meg szeretném oldani hogy fullscreenben egyszerűen adaptáljam a rezolúciót külöböző felbontáshoz/ aspect ratiohoz. Szeretném elkerülni hogy több féle méretben gyártsam le a texturákat.
Tehát valami olyan megoldás kellene amivel strech-elhetem a backbuffert...
pl fullscreen resolution legyen 1920*1080 , de a backbuffer legyen 960*540
Amíg a game nincs fullscreenben addig minden oké mert ha egy 960*540-es ablakba renderelek és nyomok 1 maximize-t akkor szépen stretcheli az egész backbuffert és minden pöpecül ki van nagyítva , de fullscreen modeban ugye nincs ilyen támogatott formátum hogy 960*540...
Esetleg : Az rossz megoldás hogy fake fullscreenben futtatom ? (
Kód: window = CreateWindowEx(
WS_EX_TOPMOST,
"STATIC",
"Game",
WS_POPUP|WS_VISIBLE |WS_VISIBLE
,0,0,winWidth,winHeight,
0,0,GetModuleHandle(0),0);
// és hagyom a windowed flagot TRUE-on ?
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.Windowed = TRUE;
d3dpp.BackBufferWidth = winWidth;
d3dpp.BackBufferHeight = winHeight;
Thanks előre is.
EDIT :
Sikerült a D3DSWAPEFFECT_COPY és a device->Present(sourceRect , destRect) kombinációjával megoldani...
Ezt a hozzászólást Dookle módosította (2013.10.05 22:21 GMT+1 óra, ---)
|
|
|
rendben...
most hogy a vertexbuffer kérdése megoldódott a DX devicet kell már csak működésre bírnom (yet again)
köszi a segítséget 
és a türelmet
|
|
|
Lockolni / unlockolni csak egyszer kell statikus data-t. Ráadásul a vertices-t ha az initben definiáltad, akkor az a függvényhívás végére fel is szabadult...
|
|
|
a kóddal az a baj hogy rage delete-tel megszabadultam tőle...
a tömböt amúgy []-val definiáltam (ahogy az meg volt írva)
de ha jól emlékszem akkor a kód így nézett ki:
Kód: //Definiálom a vertex buffert
LPDIRECT3DVERTEXBUFFER9 vertexBuffer;
//....... kód itt csak a szokásos windows cucc
void initD3D(HWND hWnd)
{
//.....itt létrehozom az objectet+ a devicet
//......
//megkreálom a vertexBuffert
d3dDevice->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX),
D3DUSAGE_WRITEONLY,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&vertexBuffer,
NULL)
CUSTOMVERTEX vertices[]{
{-1.0f,-1.0f,1.0f,/*a színe*/}
{-1.0f,1.0f,1.0f,/*a színe*/}
{1.0f,1.0f.1.0f,/*a színe*/}
{1.0f,-1.0f,1.0f,/*a színe*/}
}
}
void render()
{
CUSTOMVERTEX * pVertices
vertexBuffer->Lock(0,sizeof(vertexBuffer),(void**)&pVertices,0)
//ui: a 2. paramétert lehetne 0 is de nekem így könnyebben olvasható a kód
memcpy(pVertices,vertices,sizeof(vertices));//ezt megúszhatnám azzal hogy itt helyben adom be neki az infót de túl kényelmes vagyok
d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRBG(0,125,125),1.0f,0)
d3dDevice->BeginScene();
//itt megpróbálom kirajzolni a képernyőre a vertex buffert
d3dDevice->EndScene();
}
a kódból szándékosan kihagytam néhány nem oda való dolgot(szerintem senkit nem érdekel hogy a rózsaszín épp melyik árnyalata volt a négyzetem  ),csak a problémás darabokat hagytam benne
és pluszba lehet rájöttem mi volt a hiba  , a render függvényben próbáltam betölteni az adatokat és lehet azt nem szereti(mert nem dynamic flaggel volt deklarálva)
|
|
|
Most akkor futásidőben vagy fordításidőben? Nagyon nem mindegy. 
new-al hozod létre, vagy []-el definiáltad?
Nem azzal lesz a gond, csak a locknál száll el. Kód nélkül továbbra sem tudunk mit mondani...
|
|
|
ahogy mondtam újra kezdtem az egészet....
és most már arra szintre jutottam hogya DirectX se inicializálódik -.-"
leellenőrzök mindent (projekt settingsbe, linkernél, kódot átnézem hogy minden ugyanaz-e mint a tutorban, stb.) de meghalt és nem tudom feléleszteni... lehet akkor megtudnám ha lehetne a DXem debug módban, amit tudok is hogy hol kell beállítani csak ki van szürkézve
ja amúgy Pretender a vertices az persze hogy futásidőben ismert(4 vertex adatait kell tartalmaznia(4*sizeof(CUSTOMVERTEX) ) ), azzal semmi baj nincs,a vertexbuffert tökéletesen megkreálja, az sem NULL, a pVerticessel meg nincs teljesem megbarátkozva mert ha void* -ra rakom akkor baja van hogy nincs inicializálva(ergo nem tudunk vele dolgozni(ahogy te mondtad)) ha meg initelem(mondjuk rádobom egy (teljesen) üres memória területre)és aztán (tudtommal érvényesen) leadom a lock függvénynek, akkor meg nem mutat rá a megfelelő helyre(i.e.: a lockolt memória területre), és még egy memory leak exceptiont is kapok szóval.....
|
|
|
Amúgy a vertices változó hogy van definiálva? Az egy fordításidőben ismert méretű tömb?
A pVertices meg lehet nyugodtan void* is.
A vertexBuffer tuti nem nullpointer? Esetleg a létrehozását is be tudod másolni? (CreateVertexBuffer)
|
|
|
hozzá teszem volt már egy működő verzióm.
csak ott nem volt a geometria látható...
elfelejtettem az alpha channelt 255-re állítani
|
|
|
Nem csak copy pastelek(mostmár  )
2 a kódban csak a hibás részt írtam le, előtte már megvolt a vertex bufferem.
amennyit kiszedtem belőle az az volt hogy a vertex buffer feltöltéséhez szügséges pointer(amit a kódban is kommenteltem) a baja, a vertex buffer éldegél csak nem lehet lockolni....
vagyis lehet de nem akarja.
amugy az egész projekt egy kicsit "messy" volt szoval inkább egy kicsit több odafigyeléssel elölről kezdem a tanulmányaim
a pointereket meg köszi, ezt a részt soha nem értettem igazán (kezdők... tut-tut)
|
|
|
Legújabb project:
Szókirakó 3
Legutóbb frissített project:
Szókirakó 3
Friss kép a galériából:
|