|
|
szerintem felesleges ilyesmivel bonyolítani a dolgot, csak a kódod komplexitását növeli feleslegesen. nem lesz jelentősen lassabb a rendszered akkor se, ha szűkség esetén textúrát váltassz
|
|
|
Igen. Egy részecskerendszert akár egy textúraváltással megúszol.
alias aalberik
|
|
|
Sebesség szempontjából is a 2.ik az előnyösebb?
|
|
|
Az utóbbit, mert úgy jó eséllyel ráférsz egyetlen értelmes méretű textúrára, és nem kell sok apró kicsit betöltened hozzá.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
|
|
|
Heló!
Szerintetek sprite alapú animáció kezelésénél melyik a célszerűbb
,a képkockákat külön textúraként legenerálni, vagy pedig az össz képet egy nagy képként, és azt úgy feszíteni a quadtra hogy csak egy képkocka látszon belőle?
|
|
|
|
hát nem le lettem cseszve?! 
de most valszeg nem az lesz a bottleneck hogy 4x4-et használ 3x3 helyett, na!
|
|
|
Ha tudod egy mátrixról, h csak eltolást és forgatást tartalmaz akkor azt gyorsan tudod invertálni: minor mátrix transzponálás aztán az eltolást transzformálod és negálod a transzponált minor mátrixszal.
Ha jól tudom a skálázást is bele lehet venni a tengelyek hosszának figyelembevételével.
alias aalberik
|
|
|
Lagrange-féle kifejtési tétel (ez az a bizonyos aldeterminánsos). Telejesen jól használható, nem kell hozzá se ciklus se semmi (viszont jó sok szorzás).
|
|
|
Ketfele modszert tanultam invertalasra. Az egyik bazistranszformaciokkal tortenik, a masik pedig adjungalt matrixszal es determinansokkal. Ha jol sejtem, akkor a determinans szamolas futasi ideje faktorialis, szoval ez esetben egyaltalan nem mindegy, hogy 2x2-es vagy 3x3-as determinansokkal kell szamolni. Elso megerzesre a masik algoritmus kobos, igy ez esetben sem lenyegtelen a ketto kozti kulonbseg. Szoval ha van ra mod, akkor sporolok. Bar meg mindig nem hiszem, hogy hasznalni fogom.
Amugy Ti melyiket implementalnatok? Vagy valami mas algoritmust hasznaltok?
|
|
|
ja, azt csak összeröffentettem  tudom mi mit csinál...
|
|
|
Idézet Pretender :
Idézet MaNiAc :
Ott a pont! Például kezdésnek mi értelme a glLoadIdentity()-nek glLoadMatrix() előtt, ráadásul 2x is?
(Idezet a glLoadMatrix() doksijabol: "glLoadMatrix replaces the current matrix..."
most miről is beszélsz? 
Arról, hogy a kódodban indokolatlanul sok a glLoadIdentity(...)
|
|
|
Idézet Geri :

Igen, neked szólt, Geri. Tudom, hogy te framenként vered a milliós rajzolási számot, lászik is a szarjaidon.
|
|
|
Idézet MaNiAc :
Idézet Geri :
Idézet proof88 :
sose ilyen piszlicsáré dolgokon próbálj spórolni ... add meg a módját a dolgoknak, az algoritmusokon optimalizálj! Keresgélj, olvass utána módszereknek, van-e jobb, stb. Ilyen bájtokon nem érdemes spórolni.
ott kell spórolni, ahol bottleneck van. ha framenként 2 milliószor megcsinálod a piszlicsárét, és amiatt szaggat a gecibe, akkor a piszlicsárén kell spórolni more
Ott a pont! Például kezdésnek mi értelme a glLoadIdentity()-nek glLoadMatrix() előtt, ráadásul 2x is?
(Idezet a glLoadMatrix() doksijabol: "glLoadMatrix replaces the current matrix..."
most miről is beszélsz?
|
|
|
lol, asylum megszólalt megint
Idézet Asylum :
Ha valamit framenként 2 millioszor csinál, akkor inkább ne is programozzon.
|
|
|
Idézet Matzi :
Egy pixel shader kód azért simán lefut 2 milliószor framenként, néha ott kell optimalizálni.
Párhuzamositva nem ér
|
|
|
Kövessétek a Samsung driveríróinak a tanácsát: ne renderelj sokat, mert lassít!
alias aalberik
|
|
|
Egy pixel shader kód azért simán lefut 2 milliószor framenként, néha ott kell optimalizálni.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
|
|
|
Ha valamit framenként 2 millioszor csinál, akkor inkább ne is programozzon.
|
|
|
Idézet Geri :
Idézet proof88 :
sose ilyen piszlicsáré dolgokon próbálj spórolni ... add meg a módját a dolgoknak, az algoritmusokon optimalizálj! Keresgélj, olvass utána módszereknek, van-e jobb, stb. Ilyen bájtokon nem érdemes spórolni.
ott kell spórolni, ahol bottleneck van. ha framenként 2 milliószor megcsinálod a piszlicsárét, és amiatt szaggat a gecibe, akkor a piszlicsárén kell spórolni more
Ott a pont! Például kezdésnek mi értelme a glLoadIdentity()-nek glLoadMatrix() előtt, ráadásul 2x is?
(Idezet a glLoadMatrix() doksijabol: "glLoadMatrix replaces the current matrix..."
|
|
|
Idézet proof88 :
sose ilyen piszlicsáré dolgokon próbálj spórolni ... add meg a módját a dolgoknak, az algoritmusokon optimalizálj! Keresgélj, olvass utána módszereknek, van-e jobb, stb. Ilyen bájtokon nem érdemes spórolni.
ott kell spórolni, ahol bottleneck van. ha framenként 2 milliószor megcsinálod a piszlicsárét, és amiatt szaggat a gecibe, akkor a piszlicsárén kell spórolni more
|
|
|
sose ilyen piszlicsáré dolgokon próbálj spórolni ... add meg a módját a dolgoknak, az algoritmusokon optimalizálj! Keresgélj, olvass utána módszereknek, van-e jobb, stb. Ilyen bájtokon nem érdemes spórolni.
|
|
|
szükséged lehet rá  például, ha deferred shadinget csinálsz, ott rögtön kell.
|
|
|
Nem a mátrix invertáláson kell spórolni.
|
|
|
Nem akarok sporolni rajta, csak elmeleti sikon erdekel a dolog. Eddig meg mindenhol eltaroltam a teljes 4x4-es matrixot. Mondjuk invertalas eseten egy ilyen tulajdonsag kihasznalasa gyorsithatja az algoritmus futasi idejet. Bar nem tudom, hogy szuksegem lesz-e modelview matrix invertaltjara. Egyenlore meg nem latom sok ertelmet.
|
|
|
Akár van akár nincs, ezzel nem jo ötlet spórolni.
|
|
|
A lenyeg, hogy homogen liearis transzformacioknal alul (0,0,0,1) van. Legalabbis igy remlik, de javitsatok ki, ha tevedek.
|
|
|
Bocs, elfelejtettem irni, hogy csak Modelview matrixra gondoltam.
|
|
|
Projekciós mátrixnál lehet alul más is.
|
|
|
Egy 4x4-es matrix eseteben a legalso sornak van valamilyen specialis jelentese? En eddig csak ilyen matrixxal talalkoztam:
Kód: m00 m10 m20 x
m01 m11 m21 y
m02 m12 m22 z
0 0 0 1
Ezzel a matrixxal az utolso oszlop hatarozza meg az eltolas merteket. A m00 -> m22 3x3-as matrix pedig a forgatast es az atmeretezest valositja meg.
Tehat a kerdes ujra, hogy ne kelljen visszaolvasni:
Az also sort szoktak barmire hasznalni? Fogok valaha talalkozni olyan matrixxal, amiben az also sor nem (0, 0, 0, 1)?
|
|
|
tudom nem túl optimális a dolog, de akkor sem ésszerű, hogy alt-tab után megjavult, de a draw-ban most csak ennyi van:
Kód: glMatrixMode(GL_PROJECTION);
glLoadIdentity();
Matrix proj = Matrix::PerspectiveFOView(Pi/4.0f, 4.0f/3.0f, 0.1f, 1000.0f);
glLoadMatrixf((const float*)&proj);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Matrix viewOrient = Matrix::RotationY(0.1f * a);
Vector3 eye = Vector3(0.0f,2.0f,-5.0f);
Matrix view = Matrix::LookAt(Vector3::Transform(eye,viewOrient),Vector3::Zero,Vector3::Up);
glLoadMatrixf((const float*)&view.m);
glPushMatrix();
{
Matrix world = Matrix::RotationY(a);
glMultMatrixf((const float*)&world.m);
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex3f(0,1,0);
glColor3f(0,1,0);
glVertex3f(-1,-1,0);
glColor3f(0,0,1);
glVertex3f(1,-1,0);
glEnd();
}
glPopMatrix();
Ha a push-pop közötti kód nincs, akkor fullscreenen normális sebességgel megy az üres képernyő  alt-tab nélkül is.
|
|
|
Visual studio pro-d van? Menüböl analyze -> launch performance wizard. Azzal meg tudod nézni, hogy hol tölti az idejét.
|
|
|
Ilyesmi a baj nekem is, csak én win7-en vagyok sdl nélkül
|
|
|
Ja sry, benéztem...de a pozicio is jo nyilván...
|
|
|
A kodban, amit irtam a poziciot adom meg ( GL_POSITION ), nyilvanvaloan, ha a pozicio utolso koordinataja ( homogen koordinata ) inicializalatlan ( iranyitott feny eseten 0, pontfeny eseten 1 ), akkor furcsa jelensegeket tud produkalni ( nalam olyanok voltak a tunetek, mint amit Asylum leirt ). De ha a diffuse megvilagitas jol mukodik, akkor tobb, mint valoszinu, hogy tenyleg nem ez a gond.
|
|
|
hogy jön a pozícióhoz a color?
|
|
|
Nem hiszem, hogy ez a gond, mert nálam minden color érték 4 db float.
|
|
|
En akkor futottam bele ilyen " totál érthetetlen modon változik ahogy forog a kamera" jelensegbe, amikor nem adtam meg megfelelo meretu tombot.
Tehat peldaul igy hasznaltam:
Kód: glLightfv(GL_LIGHT0, GL_POSITION, (float[]) {1.0, 1.0, 1.0})
es nem igy:
Kód: glLightfv(GL_LIGHT0, GL_POSITION, (float[]) {1.0, 1.0, 1.0, 1.0})
De ha csak a specular rossz es a diffuse jo, akkor lehet, hogy nem jo a tippem.
|
|
|
Megint ffp-s kérdés, remélhetöleg most már az utolso 
Minden tökjo, kivéve a speculart; egyszerüen nem jelenik meg, pedig mindent beállitok (gdebuggerrel meg is néztem):
bal:dx, jobb: gl
A material propertyket igy állitom be:
Kód: glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat*)&Properties.Ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat*)&Properties.Specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (GLfloat*)&Properties.Emissive);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Properties.Power);
A fény poziciot meg minden frame elején beállitom:
Kód: SetMatrixMode(GL_MODELVIEW);
glLoadMatrixf((GLfloat*)transforms[qTS_View].transform._m);
...
glLightfv(GL_LIGHT0, GL_POSITION, (GLfloat*)pos._v);
Bizonyos helyzetekben egyébként van specular de valami totál érthetetlen modon változik ahogy forog a kamera.
|
|
|
már micsoda...?  Az SW_RESTORE?
most néztem, hogy nem is úgy csináltam.  na mind1 
Ilyen SetWindowPos-om már volt, csak máshol, de ez valamivel tényleg jobb, mint ami volt.
A probléma továbbra is fennáll, ha fullscreenben indítom, akkor lemegy 40-50 fps-re, alt-tab után megjavul. Ötlet?
szerk.:
- fullscreen indítom, fps ~ 700
- 3mp múlva: 40
- 10mp várakozás -> ~700
- 3mp-en belül újra 40
- ezt ismételgeti.
Wtf? 
vsync-el stabilan hozza a 60-at, nem megy alá.
Ezt a hozzászólást Pretender módosította (2011.12.23 13:42 GMT+1 óra, ---)
|
|
|
10 böl egy kártyán biztos jo lesz, az összes többin nem.
|
|
|
Amúgy aktiváláskor miért nem csak ShowWindow(SW_RESTORE)-t nyomsz?
Nálam is valami hasonló van, egy kevéske különbséggel.
A wglMakeCurrent miért szükséges? Ha elrejted az ablakot is, meg kikapcsolod a fullscreent, akkor jónak kell lennie.
Nálam így van:
Kód: // deactivate
ChangeDisplaySettings(0, CDS_FULLSCREEN);
ShowWindow(handle, SW_MINIMIZE);
// reactivate
Show();
if (ChangeDisplaySettings(&screen, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{ /* ... */ }
glViewport(0, 0, width, height) // a biztonság kedvéért
// Show():
void Application_win::Show()
{
ShowWindow(handle, SW_SHOW);
//SetActiveWindow(handle);
SetForegroundWindow(handle);
SetFocus(handle);
}
És végülis így működik, csak mondom első indításra lebattyog 40-50 fps körülre, ottmarad, de alt-tab után megjavul...
|
|
|
Na ez egy nagyon jo kérdés, ezzel mi is rengeteget szivtunk ám (föleg amikor open/save dialogot is fel akarsz hozni). Nálam a következöképpen megy:
Kód: case WM_ACTIVATE:
case WM_ACTIVATEAPP:
switch( wParam )
{
case WA_INACTIVE:
if( instance->active )
{
instance->HideFullscreenWindow();
instance->active = false;
instance->deactivated();
Console() << "qWin32Application::Deactivate()\n";
}
break;
case WA_ACTIVE:
case WA_CLICKACTIVE:
if( !instance->active && instance->state != qWS_Minimized )
{
instance->ShowFullscreenWindow();
instance->active = true;
instance->activated();
Console() << "qWin32Application::Activate()\n";
}
break;
default:
break;
}
break;
}
void qWin32Application::HideFullscreenWindow()
{
if( hrc && !windowed )
{
ShowWindow(hwnd, SW_MINIMIZE);
ChangeDisplaySettings(NULL, 0);
bool success = (0 != wglMakeCurrent(hdc, NULL));
}
}
void qWin32Application::ShowFullscreenWindow()
{
if( hrc && !windowed )
{
SetWindowPos(hwnd, HWND_TOP, 0, 0, dimension.x, dimension.y, SWP_SHOWWINDOW);
if( DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettings(&devmode, CDS_FULLSCREEN) )
bool success = (0 != wglMakeCurrent(hdc, hrc));
}
}
Ez eddig mindig jol müködött (ellenben a dx-el ami viszont dual monitor esetében nem képes fullscreenbe váltani).
Ezen kivül semmi mást nem kell csinálni (megintcsak szemben azzal az agyalágyult dx-el).
|
|
|
ha egy fullscreenes ablakból alt-tabolok, majd vissza, akkor miket kell visszaállítani? Mindenféle glEnable/Disable, illetve egyéb "renderstate"-hez hasonló dolgot?
Jelenleg amit biztosan nyomok, az egy glViewport. Másra van szükség?
Illetve ha már fullscreen, a nehe-s tutorialban úgy olvastam, hogy a fullscreent az ablak létrehozása előtt kell beállítani (ChangeDisplaySettings)
szerk.:
Meg történik ilyen furcsaság, hogy elindítom fullscreenben, az FPS pár mp múlva lezuhan 40-re, akörül mozog... ha alt-tabolok, aztán meg vissza, akkor meg megjavul. WTF?
|
|
|
jól sejtem ennek az interleaved dolog performanciális okok miatt létezik? Azt hiszem amúgy értem, hogy mi van, köszi. Lesznek még ilyesmi kérdéseim
szerk.:
Kód: glDepthMask = depth write enable / disable
glEnable/glDisable ( GL_DEPTH_TEST ) = depth read
Most még csak ilyen teszt háromszögek vannak bent, ha mind a kettő be vagy ki van kapcsolva, akkor jó, viszont ha a depth write ki, a depth read pedig be van kapcsolva, akkor nem látszik semmi. Miért nem?
Kód: glClearDepth(1.0f); // nyilván initnél, nem mindig
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ennek nem úgy kellene működnie, hogy akkor nem írja bele a depth bufferbe az értéket, viszont a már bennlévő értékkel dolgozik?
szerk.2.:
áhá, hogy a clear erejéig vissza kell állítani!
Ezt a hozzászólást Pretender módosította (2011.12.22 18:56 GMT+1 óra, ---)
|
|
|
Idézet Pretender :
Idézet syam :
Vagy mindent vbozol vagy semmit. A vegyes felhasználás egész szép eredményt produkálhat különösen ATI kártyákon.
Tehát akkor olyat ne csináljon az ember, hogy a tényleges scene-t vbo-zza, a fullscreen quadot meg mondjuk nem, csak "simán" kirajzolja? Vagy azért ezt lehet? 
Egy draw híváshoz tartozó adatokra vonatkozik ez a szabály.
alias aalberik
|
|
|
A vertexeknek az egyes paraméterei (pozíció, texcoord, normál stb) egyforma sorrenben kell hogy legyenek és egyforma mennyiségben, de amúgy is legtöbbször célszerű interleaved vbo-t csinálni, ahol ez adott. Azt hogy hol és milyen formában tárolod az egyes paramétereket, a gl..Pointer-ekel tudod beállítani. Itt el tudod olvasni, mi az az interleaved array, miért jó és hogyan kell csinálni.
[Asylum megelőzött...]
|
|
|
OpenGL-ben is jobban jarsz, ha osszehazasitod az attribokat egy vertexbufferbe:
Pl. shaderrel:
Kód: switch( it->Usage )
{
case qVU_Position:
case qVU_PreTransformed:
loc = (*attrtable)[qSA_Position].loc;
type = (*attrtable)[qSA_Position].type;
if( loc != -1 )
{
glEnableVertexAttribArray(loc);
glVertexAttribPointer(loc, ((type == GL_FLOAT_VEC4) ? 4 : 3), GL_FLOAT, false, stride, (void*)it->Offset);
flag |= 1;
}
break;
// ...
};
// vegen kikapcs
Illetve ffp-n:
Kód: if( it->Usage == qVU_Position )
{
glVertexPointer(3, GL_FLOAT, stride, (char*)it->Offset);
}
else if( it->Usage == qVU_Color )
{
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, stride, (char*)it->Offset);
flag |= 4;
}
// ...
Nyilvan mindketto vbo-t feltetelez.
Screenquad nyugodtan mehet vertex arraybol + user pointerbol.
|
|
|
Idézet syam :
Vagy mindent vbozol vagy semmit. A vegyes felhasználás egész szép eredményt produkálhat különösen ATI kártyákon.
Tehát akkor olyat ne csináljon az ember, hogy a tényleges scene-t vbo-zza, a fullscreen quadot meg mondjuk nem, csak "simán" kirajzolja? Vagy azért ezt lehet?
|
|
|
Vagy mindent vbozol vagy semmit. A vegyes felhasználás egész szép eredményt produkálhat különösen ATI kártyákon.
alias aalberik
|
|
|
Legújabb project:
Smashed Potatoes
Legutóbb frissített project:
Treasure Measure
Friss kép a galériából:
|