|
|
|
Tudtok olyan oldalt, ahol fel vannak sorolva a GLSL beépített függvényei?
|
|
|
|
Hogy lehetne elérni azt, hogy a modell materialja (színe) ne színezze át a textúrát is?
|
|
|
6 oldalú kocka GL_QUAD-okból, egy oldal 4 vertex egy vertex 3 poz (x,y,z):
6*4=24
24*3=72
Ha carlos könyvére gondolsz az pont meg is van, de az dx-szes. Azért a hardveres dolgokat majd átrágom, mivel az gondolom ugyanaz.
|
|
|
seeting :
Még új vagyok, de lehet hasznos a tanácsom. Elsőnek rágd át magad pár doksin, hogy is működik a videókártya, vagy az egész render pipeline, mert a kérdéseidből az jön le, hogy nagyon hiányzik neked pár alapvető koncepció.
Asszem van valami magyar csóka, aki írt játékfejlesztésről könyvet, ami kezdőknek jó, és elmagyarázza az alapokat. Azzal megpróbálkozhatnál (nem emlékszem pontosan a címére, valamilyen Károly írta), állítólag alapos (nekem is csak ajánlották).
A probléma valszeg az volt, hogy a depth test nem volt beállítva. Komplexebb geometriáknál a cull face meg nem oldja meg ugyanezt a problémát, és akkor megint fejvakargatás lesz.
A másik, az összes vertex mellett ott kell lennie az összes egyéb adatnak is (texcoord0-32). A 72 hogy jött ki neked? 6 Oldalú kocka, a legprimitívebb módszerrel is, oldalanként 2 tri, az 3 vertex strip nélkül. 6 * 3 * 2 = 36
|
|
|
Megoldva
glCullFace(GL_BACK);
|
|
|
|
Vagy a backface culling, vagy a depth test, sok választás nincs
|
|
|
Rájöttem, hogy nem is átlátszó... Azt csinálja hogy a kocka első lapja mögötti lapot (ami kocka hátoldala) az első lap elé rajzolja.
|
|
|
Akkor bizony nem maradt más, nem lehetne egy kicsit hosszabb kódot kapni, vagy hogy mikhez nyúlsz hozzá?( textúra, bufferek, stb )
|
|
|
Nincs color arrayem. glMaterialfv-t használok. Az első két ponthoz biztosan nem nyúltam. Poltergeist...
|
|
|
Nincs sok választási lehetőség:
1.: depth buffer/depth maskot megpiszkáltad
2.: A color arrayban piszkáltál valami, vagy a glColor4f-fel bűvészkedtél valamit, és elfelejtetted
3.: Stenciltesztel bűvészkedtél és az maradt benn
4.: Háromnap múlva belenézel a kódodra, és a fejedre csapsz, hogy "Hogyan nem vettem észre?!"
|
|
|
Értem. De szerintem nem ezért átlátszó mert a shotot kínomban ilyen állapotban csináltam:
glVertexPointer(3, GL_FLOAT, 0, ((*prModellsIt).second).Vertices);
glNormal3f(1.0f,0.0f,0.0f);
glDrawArrays(GL_QUADS,0,24);
Szóval elvileg minden vertexnek ugyanaz a normálvektora. Eszerint a kocka csak egy oldalán veri vissza a fényt teljesen, a többi sötét marad. De mitől látszik át?
|
|
|
Nem, egy vertexhez tartozik egy normálvektor 
( 72 vertexhez 72 normál )
egy face-hez pedig annyi normálvektor tartozik, ahány csúcsa van, triangle esetén 3, quad esetén 4, stb
mivel quadokat adsz meg, ezért egy face-hez 4 normál fog tartozni
|
|
|
Idézet Joga :
azt, hogy a normálvektor array 18 elemű ugye úgy érted, hogy kockánként 18 elemű, ugye?
72 elemű vertex arrayhoz 72elemű normálvektor array tartozik
Azért gondoltam, hogy 18 elemű, mert a kockának 6 oldala van, 1 oldal 1 face és 1 face-hez 3 normálvektor pozíció tartozik.
6*3=18
Magyarázd már el kérlek, hogy miért 72 elemű normálvektor kell
|
|
|
Idézet fpeti :
Lehet hülyeség, de nem backface-eket rajzolod? az is így néz ki.
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, material);
és counter clockwise-ban rajzolok.
Ezt a hozzászólást Seeting módosította (2010.01.23 14:26 GMT+1 óra, ---)
|
|
|
Lehet hülyeség, de nem backface-eket rajzolod? az is így néz ki.
|
|
|
azt, hogy a normálvektor array 18 elemű ugye úgy érted, hogy kockánként 18 elemű, ugye?
72 elemű vertex arrayhoz 72elemű normálvektor array tartozik
|
|
|
Mitől lehet az, hogy az objektumaim átlátszanak?

A képet a Képfeltöltés.hu tárolja. http://www.kepfeltoltes.hu
A fényeket állítottam be rosszul? Vagy talán hibás a vertex array? Esetleg a Normalvector array?
Ha van egy 72 elemű vertex array-em, ami GL_QUAD-okat határoz meg, akkor a normálvektor array 18 elemű, igaz?
|
|
|
|
|
mymap.count( index )
Ez visszaadja, hány darab index-szel jelölt elem van, ebben az esetben egy, ha van, nulla, ha nincs ilyen elem
|
|
|
Ebben meg lehet nézni valahogy, hogy létezik-e a keresett elem?
|
|
|
|
Én azt mondom az sdl::map jobb, ha index alapján tárolsz dolgokat
|
|
|
Ez a map így első ránézésre pont úgy hangzik mint ami nekem kell. Lehetne a key az index, a mapped value meg a modell osztály példánya.
Akkor azt mondod, hogy dobjam az stl::vector-t?
|
|
|
Nem kellett volna boroznom tegnap.
|
|
|
Jó, de a program sorbarendezheti betöltéskor a modelleket, nem?
szerk.: vagy próbálkozhatsz std::map-pal az valszeg jól fogja bírni a strapát
|
|
|
De az index az tetszőleges, a szkripter adja meg. Egyfajta azonosítója a modellnek. Nem növekszik.
pl.
//file elérés, index
load modell "modell1.lwo",145
load modell "modell2.lwo",93
float szog=get modell angle x(93)
Most a vectorban a 93-as modell a második helyen van, de a lekérdezés nem ezt a helyet kéri hanem az indexet.
|
|
|
Asszem bináris keresésnek hívják:
Sorbarendezed a modelleket index szerint.
Van x modelled.
megnézed az x/2 dik modelled indexét, ha nagyobb, mint amit keresel balra, ha kisebb jobbra keresel, azt a részt is kettébontod, amíg meg nem találod
|
|
|
Hogy lehetne gazdaságosan tárolni a modell indexeket?
Úgy szeretném megírni a scenemanagert, hogy könnyen lehessen szkriptelni a scene-t. Azt akarom, hogy ha betöltök egy modellt, akkor a betöltő eljárás bemenetében szerepeljen az adott modell indexe, amit a szkripter ad meg. Ez egy int.
Úgy tárolom a modelleket, hogy a modell osztálynak van egy id privátja, és egy vector-ba teszem magát a példányosított modellt.
Na most ez nem bizonyul gazdaságosnak: Ha például a játék loopjában le akarom kérdezni a modell pozícióját (a lekérdező fv. egy indexet kér be), akkor ahányszor meghívódik ez a fv, végig kell mennem a vektoron, hogy megnézzem hogy a benne lévő modellek közül melyiknek azonos az indexe a bemenettel.
Egy játék loopban rengeteg lekérdezést kell végezni számos létező modellhez, ezért nem akarom hogy x milliószor végigmenjen ugyanazon a cikluson.
Úgy akarom megoldani, mint ahogy a darkBASIC-ben van. Vajon ők hogy csinálták?
|
|
|
Le tudom kérdezni GLSL-ben, hogy engedélyezve van-e a textúrázás, vagy a fények és ha az utóbbi igen, akkor azok közül melyikek?
|
|
|
Ez gyors volt. Köszönöm a választ.
|
|
|
A glReadBuffer() függvénnyel tudod szabályozni, hogy honnan olvasson. De az alapértelmezett érték a háttérbuffer (GL_BACK), tehát nem is kell módosítanod.
|
|
|
A glReadPixels() függvény a képernyőről vagy a háttérbufferből olvas? Ha a képernyőről, akkor van valami módszer arra, hogy a háttérbufferből olvassam ki az adatokat?
|
|
|
Nah, remélem, most nem postolás után 3 másodperccel jövök rá a megoldásra, viszont az megfogott, hogy az alábbi kód lefutása után a shaderben mindhárom sampler2D ugyanarra a textúrára mutat:
Kód: glActiveTexture( GL_TEXTURE0 );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, textures[0] );
glUniform1i( glGetUniformLocation( fs, "tex0" ), GL_TEXTURE0 );
glActiveTexture( GL_TEXTURE1 );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, textures[1] );
glUniform1i( glGetUniformLocation( fs, "tex1" ), GL_TEXTURE1 );
glActiveTexture( GL_TEXTURE2 );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, textures[2] );
glUniform1i( glGetUniformLocation( fs, "tex2" ), GL_TEXTURE2 );
|
|
|
Szerk.: Semmi, hihetetlen balkuki voltam, és annyir szerkesztettem a kódot, hogy végül kikerült belőle a glCreateProgram();
na jó, mégsem lett jó
glee használata mellett döntöttem, viszont az alábbi program nem változtat az FFP-n, hibaüzenetet sem ír ki a shaderre.....Szóval az alábbi a kód az
Kód: SDL_Init( .. );
SDL_SetVideoMode( .. ) ;
után van:
Kód:
GLeeInit();
vs = glCreateShader( GL_VERTEX_SHADER );
fs = glCreateShader( GL_FRAGMENT_SHADER );
const GLchar *src_vs = LoadSource( "shader.vs" );
const GLchar *src_fs = LoadSource( "shader.fs" );
glShaderSource( vs, 1, &src_vs, 0 );
glShaderSource( fs, 1, &src_fs, 0 );
glCompileShader( vs );
glCompileShader( fs );
char buffer[2048]; //Csakúgy poénból
int l;
glGetShaderInfoLog( vs, 2048, &l, buffer );
if( l > 0 )cout << "Hiba a vertex shaderben:\n\t" << buffer << endl;
glGetShaderInfoLog( fs, 2048, &l, buffer );
if( l > 0 )cout << "Hiba a fragment shaderben:\n\t" << buffer << endl;
glAttachShader( program, fs );
glAttachShader( program, vs );
glLinkProgram( program );
|
|
|
Nincs valahol engedélyezve több texcoord array (glclientactivtexture) ? Esetleg normalpointer....
alias aalberik
|
|
|
Örvendek.
Az én problémám sajnos ennél komplexebb
Az a baj, hogy túl hardver-közeli lett a program és ezeket a bugokat már nagyon kényes megtalálni. Már egy hete erőszakolom, és semmi. Memória gondok... lehet hogy így bosszulja meg magát a Java amiért a C++-t választottam XD
|
|
|
igen, le 
Szerk.: Meg is van a megoldás: nem használtam a glew-t
Ezt a hozzászólást Joga módosította (2009.11.23 12:21 GMT+1 óra, ---)
|
|
|
A többi gl-es hívás lefut?
|
|
|
Valakinek van valami tippje arra, hogy miért tekinti a fordító a GLSL-lel kapcsolatos függvényeket( glShaderSource, glCompileShader ) deklarálatlannak, amikor az intellisense felismeri és a header file-okban is benne van?
( Code::Blocks, SDL-lel, és a glext is iclude-olva van, az OpenGL verzióm pedig 2.0.3  )
|
|
|
Itt valami felülíródik a memóriában a haverom kódjában szerintem ami hatással lehet a bufferekre.
|
|
|
Így is elszáll:
Kód: if (glIsEnabled(GL_VERTEX_ARRAY)) {glDisableClientState(GL_VERTEX_ARRAY);}
if (glIsEnabled(GL_COLOR_ARRAY)) {glDisableClientState(GL_COLOR_ARRAY);}
if (glIsEnabled(GL_BLEND)) {glDisableClientState(GL_BLEND);}
if (glIsEnabled(GL_TEXTURE_COORD_ARRAY)) {glDisableClientState(GL_TEXTURE_COORD_ARRAY);}
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, t);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER,0);
glDisable(GL_VERTEX_ARRAY);
|
|
|
Próbálj minden létező arrayt tiltani (gldisableclientstate) kivéve a vertex_arrayt...
alias aalberik
|
|
|
Idézet syam :
Ez egyre érdekesebb....
Próbáltad már GL_STATIC_DRAW-val?
Egy OGL contextben használod a vbokat?
A nehe-s első tutorial kódra építek mindent. Linuxosra. GLX ablak.
Ott ez van:
/* create a GLX context */
GLWin.ctx = glXCreateContext(GLWin.dpy, vi, 0, GL_TRUE);
Ehhez nem nagyon értek, azért kopiztam onnan.
Idézet proof88 :
csinálj egy új projektet, a lehető legkevesebb kóddal és próbáld ott reprodukálni a hibát
Nem csinálok, mert tudom, hogy úgy megy. Összeraktuk a kódunkat haverommal és mégis az enyémnél száll el (a rajzolásnál).
|
|
|
csinálj egy új projektet, a lehető legkevesebb kóddal és próbáld ott reprodukálni a hibát
|
|
|
Ez egyre érdekesebb....
Próbáltad már GL_STATIC_DRAW-val?
Egy OGL contextben használod a vbokat?
alias aalberik
|
|
|
Már simán csak ennél is elszáll:
Initbe:
Kód: glGenBuffers(1,&t);
GLfloat v[9];
v[0]=-1;v[1]=-1;v[2]=0;
v[3]=1;v[4]=-1;v[5]=0;
v[6]=0;v[7]=1;v[8]=0;
glBindBuffer(GL_ARRAY_BUFFER,t);
glBufferData(GL_ARRAY_BUFFER, sizeof(v), v, GL_DYNAMIC_DRAW);
A Loopba:
Kód: glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, t);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
És nem tudom, hogy hol hibázik és miért... Segfault a drawarraysnél.
|
|
|
Legújabb project:
electronics
Legutóbb frissített project:
NeonCode
Friss kép a galériából:
|