|
|
áhá, ezt kerestem  nem tudom hogy nem találtam meg
|
|
|
|
Hol van az hivatalosan leírva, hogy a GLSL-ből mik lettek kiszedve, amik már nincsenek benne a szabványban? pl. ilyesmikre gondolok: gl_ModelViewProjectionMatrix
|
|
|
az emlékeim szerint mintha bent lett volna, de nem volt jó. Persze lehet, h később pont kikommenteztem xD
|
|
|
Nem kell ám neki, elég, ha a lezáró '\0'-t beírod a tömb utolsó elemének
|
|
|
úgy néz ki, hogy én is a shaderekkel bajlódok... 
vertex shader:
Kód: void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
fragment shader:
Kód: void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
Betöltöm a szöveges fájlt fread-del:
Kód: FILE* stream = 0;
fopen_s(&stream, path.c_str(), "r");
if (!stream)
return false;
fseek(stream, 0, SEEK_END);
int size = ftell(stream);
fseek(stream, 0, SEEK_SET);
char* file = new char[size + 1];
fread(file, 1, size, stream);
Majd ezekből shader-t gyártok
Kód: shader = glCreateShaderObjectARB(shaderType);
glShaderSourceARB(shader, 1, (const char**)&file, 0);
glCompileShaderARB(shader);
Idáig elvileg nincs error, viszont amikor a "program"-ot akarom létrehozni, és ott lekérem az errort
Kód: program = glCreateProgramObjectARB();
glAttachObjectARB(program, vs->GetShader());
glAttachObjectARB(program, ps->GetShader());
glLinkProgramARB(program);
Akkor kapok egy hibaüzenetet (ugyan ilyet a vertex shaderre) :
Kód: Fragment shader failed to compile with the following errors:
ERROR: 0:4: error(#132) Syntax error: '<' parse error
ERROR: error(#273) 1 compilation errors. No code generated
Ezmiez?
szerk.:
Banyek, hogy mindig akkor jövök rá, amikor bepostolom, de előtte ott nézem 2 óráig 
kell neki egy memset(file, 0, size+1)
Ezt a hozzászólást Pretender módosította (2012.01.07 21:54 GMT+1 óra, ---)
|
|
|
A MAC rohadjon csak meg, ahol van  Nekem az már bőven jó lesz, ha esetleg linuxon le tudom majd fordítani, de nem életcélom. Viszont jelentem, egész tetszetős az OGL, kezdem megszokni, csak tök hülye vagyok hozzá
|
|
|
Nem lesz jó, mert akkor macen irhatod ujra.
|
|
|
Akkor jó lesz az utóbbi
|
|
|
A szabványban az elöbbi, extensionben az utobbi
|
|
|
Amúgy akkor most
Kód: glCreateShader
vagy
Kód: glCreateShaderObject
?
|
|
|
Nem dob semmi hibát,és a shader is beáll rendesen.
|
|
|
gdebuggerrel nézd meg hogy dob-e valami errort, és beállitodik-e a shader.
|
|
|
Itt hozom létre a shadert.
Kód: int fragmentObject = GL.CreateShader(ShaderType.FragmentShader);
// Compile vertex shader
GL.ShaderSource(fragmentObject, fs);
GL.CompileShader(fragmentObject);
GL.GetShaderInfoLog(fragmentObject, out info);
GL.GetShader(fragmentObject, ShaderParameter.CompileStatus, out status_code);
if (status_code != 1)
throw new ApplicationException(info);
program = GL.CreateProgram();
GL.AttachShader(program, fragmentObject);
GL.LinkProgram(program);
GL.UseProgram(program);
Majd kirajzolásnál pedig beállítom a spotlightot,és meghívom a kirajzolást.
Kód: float[] light0_dir = new float[] { 0, 0, -1 };
float[] light0_pos = new float[] { 500, 500, 1000f, 1 };
GL.Light(LightName.Light0, LightParameter.SpotDirection, light0_dir);
GL.Light(LightName.Light0, LightParameter.SpotCutoff, 45.0f);
GL.Light(LightName.Light0, LightParameter.SpotExponent, 100.0f);
GL.Light(LightName.Light0, LightParameter.Position, light0_pos);
GL.UseProgram(Shader.shader_program);
// Textúrázás...
GL.BindTexture(TextureTarget.Texture2D, QObject.Texture.TextureData);
// Kirajzolás
GL.CallList(QObject.GLVertex);
|
|
|
Idézet Mangal :
Fragment shadert szeretnék működésre bírni,de sehogy sem akar összejönni.
Mivel tilemap alapú a pálya szerkezetem,és a minden tile 128*128as,ezért a vertexre számolt fény elég furán néz ki.Ezért gondoltam a fragment shaderre.
Betöltöm fájlból a shadert lefordítom,lekérem van e hiba,viszont nemjelez hibát,
megcsinálom az AttachShader-t,beállítom a programot,kirajzolás előtt use-olom a programot,
Majd CallList-est meghívom a kirajzolást,viszont semmi hatása nincs.
Egyszerűen mintha nem is volna,ugyanúgy vertex-re számolja a fény hatását.
Valami lépést kihagytam volna?
Szerintem mutass 1-2 kódrészletet, mert ebből nehéz rájönni, mit rontassz el
|
|
|
Igen, az lett belőle, csak ahhoz kellett az is, amit a szerk.-be írtam. Hát persze, hogy arról egyik tutorial sem írt (legalábbis azok között, amiket én olvastam  )
|
|
|
Kód: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
helyett
Kód: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
?
|
|
|
nekem meg csudijó, van már modell meg textúra meg ilyesmi, a kérdés csak az, hogy azt a kis "zizit" hogy tudom eltüntetni? Az oldalán látszik.

DDS-t töltöttem be, elvileg 5 level, azaz van mipmap,
Kód: glCompressedTexImage2DARB(GL_TEXTURE_2D, i, image->format, mipWidth, mipHeight, 0, size, image->pixels + offset);
illetve előtte beállítva, hogy
Kód: glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Valami kapcsolót kihagytam, vagy mi? Vagy csak elrontok valamit
szerk.:
talán ez?
Kód: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, image->numMipMaps-1);
Ezt a hozzászólást Pretender módosította (2012.01.07 00:01 GMT+1 óra, ---)
|
|
|
Nemis
|
|
|
Asylum, mostanában flegma vagy
|
|
|
Igen, megtanulni az opengl-t.
|
|
|
Fragment shadert szeretnék működésre bírni,de sehogy sem akar összejönni.
Mivel tilemap alapú a pálya szerkezetem,és a minden tile 128*128as,ezért a vertexre számolt fény elég furán néz ki.Ezért gondoltam a fragment shaderre.
Betöltöm fájlból a shadert lefordítom,lekérem van e hiba,viszont nemjelez hibát,
megcsinálom az AttachShader-t,beállítom a programot,kirajzolás előtt use-olom a programot,
Majd CallList-est meghívom a kirajzolást,viszont semmi hatása nincs.
Egyszerűen mintha nem is volna,ugyanúgy vertex-re számolja a fény hatását.
Valami lépést kihagytam volna?
|
|
|
előtte van beállítva, nem kell aggódni 
Megvan a megoldás, bár még nem próbáltam ki, de biztos ez a baja:
Idézet Another solution, available in OpenGL 1.2 (and as an extension to many 1.1 implementations), is glEnable(GL_RESCALE_NORMAL)
szerk.:
Ezzel így valóban jó.
|
|
|
Mivel szorzod be a mátrixot ha nincs beállitva semmi?  (brotip: glLoadIdentity())
|
|
|
Sikeresen betöltöttem egy modellt, vannak pozíciók, texcoordok meg normálok (normalizáltak).
Beállítottam egy fényt is:
Kód: float lAmbient[] = {0.2f, 0.2f, 0.2f, 1.0f};
float lDiffuse[] = {1.0f, 0.85f, 0.7f, 1.0f};
float lPos[] = {-100.0f, 50.0f, -25.0f, 1.0f};
glLightfv(GL_LIGHT1, GL_AMBIENT, lAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, lDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, lPos);
Base::StateManager::GetInstance()->Enable(GL_LIGHT1);
Base::StateManager::GetInstance()->Enable(GL_LIGHTING);
Nagyon jól működik, amíg a ModelView mátrixot nem skálázom. Így jó
Kód: glPushMatrix();
{
Matrix world = Matrix::RotationY(a);
glMultMatrixf((const float*)&world.m);
m->GetMesh(0)->Draw();
}
glPopMatrix();
így meg nem
Kód: glPushMatrix();
{
Matrix world = Matrix::Scale(0.01f) * Matrix::RotationY(a);
glMultMatrixf((const float*)&world.m);
m->GetMesh(0)->Draw();
}
glPopMatrix();
Ez így gondolom nem egészen természetes.
Renderelés: VBO, fixed function
|
|
|
Idézet Mangal :
Szerintetek érdemes építeni az opengl-es pickingre vagy inkább sajátkezűleg számoljam ki?
Bonyulultabb a manuális, de ha jól megírod, sokkal gyorsabb. Ha scenegraph-os techikával renderelsz, akkor pedig könnyű beilleszteni is.
|
|
|
Szerintetek érdemes építeni az opengl-es pickingre vagy inkább sajátkezűleg számoljam ki?
|
|
|
tudom, le van töltve, de előbb inkább körülnézek- és kérdezősködök
|
|
|
Igen, hasonlo mint a vertexdecl de tobbet tud.
Amugy utalom reklamozni magam de a honlapomon meg mindig ottvannak a gl progik (mas kerdes hogy nem teljesen "validak"  . Onnan tudsz lesni.
|
|
|
Szerk: Nevermind, már látom, hogy megoldottad
|
|
|
Kipróbáltam, hogy külön vettem az értékeket. Úgy se jó. Érdekes módon ez után:
Kód: glBufferDataARB(GL_ARRAY_BUFFER_ARB, numVertices * sizeof(Vertex), &vertices[0].px, GL_STATIC_DRAW_ARB);
GL_INVALID_VALUE error-t ad a glGetError(), ami a doksi szerint akkor jön elő, ha a size negatív. Pedig megnéztem, és 768 ha jól rémlik, ami szerintem nem negatív
szerk.:
megjavult. Hülye voltam  Extension-nél benéztem... először azt néztem, hogy kell ez a SubData is, aztán copy-paste volt, aztán rájöttem, hogy nem fog kelleni, kiszedtem a sub részt, de így a sima glBufferData a "glBufferSubData" extension lett.  Na, működik, az a lényeg.
Ezek a gl*Pointer hívások olyasmik, mint dx-ben a SetVertexDeclaration, ha jól értem
szerk.2:
Ahogy egyelőre észrevettem, a gl*Pointer dolgokat elég a bufferek létrehozásakor az unbindelés előtt beállítani, a client state-ket pedig az összes mesh előtt és után. Legalábbis egyelőre.
Ezt a hozzászólást Pretender módosította (2012.01.03 07:16 GMT+1 óra, ---)
|
|
|
Csak gondoltam spórolok ezen is  Amúgy milyen oka lehet annak, hogy ha VBO-val próbálok rajzolni, akkor semmi nem látszik?  az lehetséges, hogy azért, mert a GPU-nak feltöltött Vertexstruktúrámban a Position, Normal meg Texcoord egy-egy másik struktúra? (Vector3, Vector2)
Szóval így:
Kód: struct Vertex
{
Vector3 Position;
Vector3 Normal;
Vector2 Texcoord;
static const int SIZE = 32;
|
|
|
Idézet Pretender :
A bind az nekem rendben van, én a client statekre, meg a glVertexPointer-re és társaira gondolok. Ha az minden egyes modellnél azonos (pl. Position, Normal, Texcoord mindegyiknél), akkor ezeket nem elég egyszer beállítani? Hasonlóan a glEnableClientState.
Erre ne építs, sose tudhatod hogy mikor bövited ki ugy az enginet, hogy tetszöleges layoutot tudjon használni (nálam az van, bár a dx miatt van egy default konvencióm, de egy maces programozó pont le fogja szarni). Azt viszont meg lehet csinálni, hogy minden layouthoz csinálsz egy egyedi azonositót, és ezeket a glpointer fveket levéded.
|
|
|
Ezt nem tudom. Meg kell nézni doksiban, hogy a vbo bindja érvényteleníti-e a már beállított offsetet.
alias aalberik
|
|
|
A bind az nekem rendben van, én a client statekre, meg a glVertexPointer-re és társaira gondolok. Ha az minden egyes modellnél azonos (pl. Position, Normal, Texcoord mindegyiknél), akkor ezeket nem elég egyszer beállítani? Hasonlóan a glEnableClientState.
|
|
|
A "belőni" az nem teljesen egyértelmű számomra.
Kitalálod mit raksz a vboba és amikor használni akarod a belerakott adatot akkor bindolod azt. Ha olyan adatot akarsz használni ami nem abban a vboban / nincs egyáltalán vboban akkor bindolod a másik vbot / 0-t bindolsz.
alias aalberik
|
|
|
de ha az összes mesh "komponensei" megegyeznek (azaz pl. mindegyik csak position, texcoord, normal), akkor azt elég egyszer belőni az összes mesh előtt, és nem kell mindegyiknél?
|
|
|
Mangal:
Per-fragment árnyalás kell neked csak azzal tudsz ilyet - vagy tesszellálod a 2 quadot.
Pretender:
A VBO az nem egyenlő vertex array. Nincs belőle többféle és nincs hozzá enable/disable - "bind van csak". A VBO "gpu oldali" adattárolásra való, nem tudja milyen adat van benne, hány komponensű. Csak a méretét tudja byteban.
A glvertexattribpointer vagy glvertexpointer és társaira van hatással ill. a gldraw... függvényekre.
alias aalberik
|
|
|
Azzal is ez a helyzet,csak a csúcspontokat világítja be.
|
|
|
Idézet Mangal :
Heló!
Irányított fénynél hogy lehet elérni,hogy egy 2d quadnál egy kört világítson ki,ne pedig csúcspontokra számolja ki a hatást?
Az irányított fénynek a lényege, hogy minden pontra ugyan úgy hat. Kört az spot lighttal tudsz
|
|
|
akkor ahol lehet, érdemes az ARB-s verziót használni, ha jól értem. 
Mostanában nem csináltam semmit, szóval ismét VBO: hogy van ez akkor? Láttam több félét is, pl. EnableClientState minden egyes mesh esetén kell, vagy csak rajzolás előtt, és Disable az összes mesh rajzolása után? Illetve:
glEnableVertexAttribArray vs. gl*Pointer
Illetve ugye ehhez kapcsolódóan igaz-e ez is, az előzőre? (összes mesh rajzolása előtt, vagy minden mesh előtt?)
|
|
|
Heló!
Irányított fénynél hogy lehet elérni,hogy egy 2d quadnál egy kört világítson ki,ne pedig csúcspontokra számolja ki a hatást?
|
|
|
Arra figyelj, hogy nem mindegyiknél csak a postfix a különbség; például a shaderes extension eléggé át lett nevezgetve (viszont so far ez az egyetlen lényeges).
|
|
|
Elvileg semmi.
Gyakorlatilag a postfix nélküli változat már a core része vagyis ahhoz már az adott verziójú OGL támogatás szükséges.
Pl. ha FBO-t használsz EXT nélkül, akkor 3.0 a min. verziókövetelmény, ha EXT-tel használod akkor csak 1.1 (+ FBO extension támogatás).
alias aalberik
|
|
|
Mi a különbség a "sima" és az ARB extensionök között? pl. glBufferData vs. glBufferDataARB
|
|
|
Idézet Geri :
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
Na, meg is van egy újabb optimalizáció a számodra. Jó munkát
|
|
|
Idézet zeller :
kezelheted kulon modulkent
Ilyet ne mondj neki, az lassitja a forditást
|
|
|
@geri
Sztem egy ilyen kodot eleg egyszer megirni, ha standardizalod a parametereit a texturanak, ezt pedig kezelheted kulon modulkent igy nem fujja fel a kodot. Sot, a legjobb, ha meta kodot irsz es forditokat gpu-kra
|
|
|
Én minden epszilonnál kisebb marhasághoz textura atlaszt használok (és mellé természetesen static vagy dynamic batchinget ami részecskéknél elengedhetetlen).
|
|
|
Én az összes részecskerendszert is képes vagyok egy rajzolással megoldani, mert color-ban átadok tile méretet x,y indexet tile-ra és elfordulást, így még külön-külön foroghatnak is - ezt pixelshaderben, a tileozás vs-ben mehet. Elég jól bevált. így egy rajzolás a alfásoknak, egy a addivitve és egy a sima blendelteknek. Mondjuk ez azoknak lehet fontos, ahol sok minden robbanhat egyszerre. hehe
|
|
|
Legújabb project:
Smashed Potatoes
Legutóbb frissített project:
Smashed Potatoes
Friss kép a galériából:
|