Opengl polygon készítése
2018-05-05T11:54:50+02:00
2018-05-26T12:50:57+02:00
2022-08-11T03:35:37+02:00
atkabacsi
Sziasztok!

OpenGl-ben szertnék 3D polygont készíteni egy 2D vertex listából. A polygon mindig vízszintes lenne és párhuzamos vagyis a a 2D polygont 3D-re kéne vastagítani megyadott értékkel. Gondoltam a Triangle fan erre alkalmas lenne de úgy még csak két párhuzamos polygont tudnék létrehozni. A pontjaik közötti részt ki kéne egészíteni háromszögekkel vagy inkább négyzetekkel és a norálokat is kiszámítani rá. Ez így eléggé bonyolult. Nincs erre valami egyszerűbb megoldás mint pl a glut sphere, box? Néztem de nem láttam polygont benne.
Mutasd a teljes hozzászólást!
Csatolt állomány
OpenGL Tessellation
Ezzel tudsz officialisan lyukas polykat tesszelalni. Kimenetkent 3szogeket kapsz. Lassu, de tokeletes az eredménye. Szoval ha statikus polygonokrol van szo, akkor eleg ezt csak egyszer megcsinalni es a 3szogeket elmenteni a jatekhoz.
Mutasd a teljes hozzászólást!

  • Ha "középpontosan konvex"-ek a fedőlapjaid (csak fantáziakifejezés, arra gondolok, hogy bár maga a síkidom nem feltétlenül konvex, van olyan pontja, ahonnan az összes csúcsponthoz vezető szakasz a síkidomon belöl halad), akkor a triangle fan ki bírja őket rajzolni. A peremen meg egy triangle strip-et futtathatnál körbe. Ha van quad strip, persze az is jó.
    Mutasd a teljes hozzászólást!
  • A triangle-fan mégsem lesz jó, marad a polygon quad strip-el ha nincs egyszerűbb mód rá. Egyébként nem tudom hogy merjem e még használni a quadokat mert azt olvastam hogy OGL3-tól kivették belőle. VB6 -ban írogatok és a terepet eddig quad strip-el éítettem fel. Nem vettem észre hogy ne működne akár win 10 alatt is újabb vga karikkal. Mi lesz akkor a régebbi játékokkal amik használják?
    Mutasd a teljes hozzászólást!
  • hi,
    - a quadokat felejsd el. Ugyan működnek kompatibilis módban, de hát új programnál legacy ficsőrt nem használunk...
    - miért nem csinálsz egy indexed triangle soup-ot? manapság már nincs sok értelme a strip-nek meg ezeknek. Az indexek ismétlődésénél úgyis kess-be teszi a vga a vertex shader eredményét, és nem futtatja le ismételten. Igazából egy indexelt 3szög halmaz (GL_TRIANGLES) és a strip (GL_TRIANGLE_STRIP) között szinte semmi sebességkülömbség nincs. Tedd őket vbo/ibo-ba, h ne add át minden híváskor a vganak a vertexindexeket és szupergyors lesz.
    A quad-strip-t egyébként emulálják, tehát kb egy triangle-soup sebességével rajzolsz vele. De mint említettem nagy külömbség nincs. A programodban a legnagyobb sebesség-visszaesést a vb6 jelenti...
    Mutasd a teljes hozzászólást!
  • A triangle-fan mégsem lesz jó, marad a polygon quad strip-el ha nincs egyszerűbb mód rá. 

    Gondolom elbeszélünk egymás mellett. A két párhuzamos fedőlapra (a hasáb teteje meg alja) javasoltam a triangle fan-t, az oldalára az tuti nem alkalmas, oda jó a strip.
    Mutasd a teljes hozzászólást!
  • Bocs ha nem voltam egyértelmű, természetesen én is a fedőlapokra gondoltam csak közben rájöttem hogy nem biztos hogy konvexek. Poligont még nem használtam azért nem ugrott be. A quad strip viszont jó ötlet az oldalára! Csak a normálokat kell kitalálnom rájuk még. Márminr az oldalakra a fedőlap az egyszerű.
    Mutasd a teljes hozzászólást!
  • Nagyon köszönöm az infót! Ha a quadok ezután is működni fognak akkor inkább maradok annál! A vertex indexeket nem adom át minden hívásnál mivel display listben vannak. Az objektumokat pedig optimalizálom miközben a listába teszem , felesleges paraméterteket igyekszem nem átadni újra. A statikus megjelenítési sebességbe a VB6 sokat nem szól bele szerintem mert egy több ezer objektumos scene is 10-20% CPU körül mozog csak a gpu teker, úgyhogy ez nekem elég! :) Természetesen dinamikusan változó objektumoknál már más lenne a helyzet azt aláírom.
    Mutasd a teljes hozzászólást!
  • Csak a normálokat kell kitalálnom rájuk még. 

    Általános esetben: vektoriális szorzat (a fedőlap éle és a két fedőlapot összekötő él irányvektorai)
    A te esetedben viszont derékszögű a hasáb, úgyhogy a normálvektort a síkidom éleinek a 90 fokos kiforgatásával is meg tudod határozni. A körüljárási irányon meg hogy az "előző" vagy a "következő" pont körül forgatsz-e, múlik a "kifele forgatás" előjele (+ vagy - 90 fok, de igazából 90 fokos forgatás az csak koordináta tükrözés és cserebere, hiszen a koszinusza 0, a szinusza meg 1).
    Mutasd a teljes hozzászólást!
  • Közben megtaláltam egy régebbi megoldásodat a konvex sokszög kirajzolására, de sajnos a stencil buffert én másra szeretném használni úgyhogy ez kiesik sajnos. Fel kell valahogy osztanom a sokszöget :( Az olallapok lettek az egyszerűbbek úgy tűnik.
    Konkáv sokszög rajzolás Dephi/OpenGL-ben probléma
    Mutasd a teljes hozzászólást!
  • OpenGL Tessellation
    Ezzel tudsz officialisan lyukas polykat tesszelalni. Kimenetkent 3szogeket kapsz. Lassu, de tokeletes az eredménye. Szoval ha statikus polygonokrol van szo, akkor eleg ezt csak egyszer megcsinalni es a 3szogeket elmenteni a jatekhoz.
    Mutasd a teljes hozzászólást!
  • Köszi az jó lenne de VB6 alá be lehet hegeszteni?
    Mutasd a teljes hozzászólást!
  • A glu32.dll-t gondolom VB6-ban is lehet hasznalni. Szoval ha lehet, akkor igen.
    Mutasd a teljes hozzászólást!
  • Nagy nehezen sikerült bevarázsolni hogy működjön a glut tesselatora.
    A háromszögekre bontás jól működik de az árnylásnál jópár iránya megfordul a képen láthatóan. Ez természetes amit korrigálni kell még, vagy valami hiba van a kódban?

    kód:
    Public Function Triangulate(h1 As Double, magas As Double, fixcolor As Long) Dim tobj& Dim i As Long TIndex = 0 tobj = gluNewTess gluTessCallback tobj, GLU_TESS_BEGIN, AddressOf glBeginCB gluTessCallback tobj, GLU_TESS_END, AddressOf glEndCB gluTessCallback tobj, GLU_TESS_ERROR, AddressOf glErrorCB gluTessCallback tobj, GLU_TESS_VERTEX, AddressOf glVertex3dvCB ReDim Poly(0 To UBound(Vdata) - 1) As VERTEX For i = 0 To UBound(Poly) Poly(i).X = Vdata(i + 1).X Poly(i).Z = Vdata(i + 1).Y Poly(i).Y = h1 Next Dim id() As Double ReDim id(0 To UBound(Poly)) As Double ReDim triangles(0 To UBound(Poly) * 3) As Long gluTessBeginPolygon tobj, 0& gluTessBeginContour tobj For i = 0 To UBound(Poly) id(i) = i gluTessVertex tobj, Poly(i).X, id(i) Next gluTessEndContour tobj gluTessEndPolygon tobj gluDeleteTess tobj Dim retur() As POINTAPI_DOUBLE If TIndex > 0 Then ReDim retur(0 To TIndex - 1) As POINTAPI_DOUBLE glNewList 132 + tesso, lstCompile '132 től kjülön display listbe!!!! glDisable glcTexture2D glColor4f (fixcolor And 255) / 255, ((fixcolor \ 256) And 255) / 255, ((fixcolor \ 65536) And 255) / 255, 1 glBegin bmTriangles For i = 0 To TIndex - 1 retur(i).X = Poly(triangles(i)).X retur(i).Y = Poly(triangles(i)).Z glVertex3d retur(i).X, h1, retur(i).Y Next glEnd glEndList tesso = tesso + 1 End If End Function
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Akkor korrigalnod kell... (Fura, hogy unordered 3szogeket ad vissza a glu...)

    Mivel tudjuk, hogy vizszintes a cucc, emiatt:
    normal.xy = (0,0); normal.Z = vCross(A-B, A-C) <0 ? -1 : 1;
    Mutasd a teljes hozzászólást!
  • A callback függvények:
    Sub glBeginCB(ByVal which&) Dim S$ glBegin which Mode = which index = 0 End Sub Sub glEndCB() glEnd End Sub Sub glErrorCB(ByVal errorCode&) '??? Dim estring$, S$ estring = gluErrorString(errorCode) Debug.Print "Tessellation Error: " & estring Select Case errorCode Case GLU_TESS_MISSING_BEGIN_POLYGON Debug.Assert 0 Case GLU_TESS_MISSING_END_POLYGON Debug.Assert 0 Case GLU_TESS_MISSING_BEGIN_CONTOUR Debug.Assert 0 Case GLU_TESS_MISSING_END_CONTOUR Debug.Assert 0 Case GLU_TESS_COORD_TOO_LARGE Debug.Assert 0 Case GLU_TESS_NEED_COMBINE_CALLBACK Debug.Assert 0 Case errorCode >= GLU_TESS_ERROR1 And errorCode <= GLU_TESS_ERROR8 '10151-10158 Debug.Assert 0 Case Else Debug.Assert 0 End Select Stop End Sub Sub glVertex3dvCB(ByRef arg#) glVertex3dv arg tesspoints(index) = arg index = index + 1 Select Case Mode Case 4 If index = 3 Then triangles(TIndex) = tesspoints(0) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(1) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(2) TIndex = TIndex + 1 index = 0 End If Case 5 If index = 3 Then If (Not (index And &H1)) Then triangles(TIndex) = tesspoints(0) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(1) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(2) TIndex = TIndex + 1 Else triangles(TIndex) = tesspoints(1) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(2) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(0) TIndex = TIndex + 1 End If tesspoints(0) = tesspoints(1) tesspoints(1) = tesspoints(2) index = 2 End If Case 6 If index = 3 Then triangles(TIndex) = tesspoints(0) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(1) TIndex = TIndex + 1 triangles(TIndex) = tesspoints(2) TIndex = TIndex + 1 tesspoints(1) = tesspoints(2) index = 2 End If End Select End Sub
    Mutasd a teljes hozzászólást!
  • Köszi a kódot! Fura sztem is hogy ennyit kell vele bajlódni. Mivel csak egyszerű konkáv vagy konvex polygonok lesznek megpróbálok írni hozzá egy ear clippinget. Már csak azért is mert van amikor látszólag minden ok nélkül kilép a program ha megy a tesselátor. :(
    Mutasd a teljes hozzászólást!
  • Varázslás helyett inkább a https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluTess.. -t állítsd be. "See Also"-ban találtam a többi gluXy függvény mellett...
    Mutasd a teljes hozzászólást!
  • Köszi ezt nem tudtam! gluTessNormal tobj, 0, 1, 0 beállítással már sokat javul, de ha bekapcsolom a cullingot látszik hogy irányprobléma is van.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Siker! Jó lett a poligon és a normálokat is sikerült kiszámolni a palástra a tanácsaid szerint. A gluTessNormalt végülis hagytam alapon és a nem jó körbejárású háromszögeket mefordítottam.A glut tesselátora egyébként nálam kicsit háklis arra hogy elég időt akapjon a művelet befejezésére, mielőtt újra hívom ezért GLflush-al és kis várakozásokkal kell használnom mert különben random hibákat dobál. Ez mostmár szép és jó márcsak árnyékolás kéne, Megvan a következő téma. :) Köszönöm minenkinek a segítséget!
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Az arnyekolast is neked kell kiszamolni.

    En ugy csinalnam, hogy minden quad-ra kiszamolnam a normalokat, csak a quad alapjan.
    Egy kovetkezo lepesben pedig azoknal a szomszodes quadoknal, amelyek majdnem parhuzamosak, ott a 2 quad talalkozasanal levo normalokat atlagolnam es normalizalnam. Emiatt a T-betu szogletes lesz, az O betu meg lesimitott.
    Mutasd a teljes hozzászólást!
  • Polygon smooth van rajta az ívek szépen lekerekednek. A sarkoknál ott ahogy írtad még lehet finomítani. Igazából a vettet és önárnyékra gondoltam az még sokan dobna a látványon, de az 100x nehezebb téma gondolom.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Szerintem mihamarabb tanulj bele a GLSL-be. Azzal elegge megnyilnak a lehetosegek elotted. A shadertoy.com-on rogton ki is probalhatod, hogy hogyan mukodik a pixel shader.
    Mutasd a teljes hozzászólást!
  • A GLSL is összeházasítható a VB5, vagy 6-al? Mert én abban szeretném írni mindenképpen! És az opengl alap nyelvezetét is szeretném megtartani max kiegészítésként használni shadereket ahol nagyon muszáj. Igazából én shaderek nélkül szeretnék csinálni legalább vetett árnyékot. Minél kevesebb függőségben szeretnék lenni.
    Mutasd a teljes hozzászólást!
  • A GLSL is összeházasítható a VB5, vagy 6-al? Mert én abban szeretném írni mindenképpen!

    Valószínűleg igen. A GLSL-t nagyon nem érdekli, az minden nyelvben csak egy sztring.
    (A hivatkozott WebGL példában ez a két sor a GLSL:
        gl.shaderSource(vs, "attribute vec2 coords;void main(void){gl_Position = vec4(coords, 0.0, 1.0);}");
        gl.shaderSource(fs, "void main(void){gl_FragColor=vec4(1.0, 0.0, 0.0, 1);}");
    C-szerű "main" függvény, amit a GLSL fordítónak adsz át, tetszőleges nyelvből)

    Ettől függetlenül van értelme kortárs nyelvek használatának, pl. ha segítséget kérsz valahol, akkor VB6-os kódot nem biztos, hogy csak úgy ki tudnak próbálni az emberek.

    És az opengl alap nyelvezetét is szeretném megtartani

    Hát, te tudod. Oka van annak, hogy előrefele fejlődnek a dolgok, nem pedig visszafele.

    max kiegészítésként használni shadereket ahol nagyon muszáj

    Ilyet valószínűleg nem tudsz, a két pipeline tudtommal nem kombinálható.

    Igazából én shaderek nélkül szeretnék csinálni legalább vetett árnyékot.

    Az alap-árnyék stencil bufferrel készül, nem kell hozzá shader.

    Minél kevesebb függőségben szeretnék lenni

    Ez egy értelmezhetetlen kijelentés. Az ős VB és az ős OpenGL használata 2018-ban már bőven nem azt biztosítja, hogy minél több helyen fusson a kódod, hanem hogy mindenhol nehézkesen, már csak bottal piszkált, immel-ámmal életben tartott alternatív útvonalakon fusson.
    Mutasd a teljes hozzászólást!
  • Az ős VB és az ős OpenGL használata 2018-ban már bőven nem azt biztosítja, hogy minél több helyen fusson a kódod

    Lehet hogy így van de ,még win2000-től win10-ig is elég egy MSVBVM50.dll meg  egy vbogl.tlb és máris szépen fut a programom. Nem kell hozzá több száz mega runtime library meg egyebek. A VB5 is tökéletesen megy rajta. Én annak örülnék ha a Microsoft végre meghallgatná a több millió ember kérését és fejlesztené a mai igények szerint. A Net vonal az egy teljesen más világ nem szeretem de ezt már sokszor leírtam.

    Az OpenGl-ben azt szeretem hogy még értem mi történik a háttérben egy utasítás kiadásakor, a túl magasszintű dolgok már elfedik ezt.  Shadow=ON  azért jó lenne :) 
    Persze nyilván az újabb vidókártyák egy csomó képességét már nem fogom tudni kihasználni vagy csak igen nyakatekerten ez tény de, egyenlőre ezzel együtt tudok élni.

    VB6 fanoknak esetleg tudsz magyar nyelvű fórumot ahol fel lehet tenni ilyen kérdéseket, akkor inkább ott próbálkozok. Szerencsére azért itt is jó ötleteket, tanácsokat tudtok adni!
    Konkrét kódot nem nagyon szoktam kérni inkább az elv érdekel aztán valahogy összemazsolázom a megoldást. Minden tanácsot szívesen meghallgatok! (A VB kukázása nem fog menni míg nincs jobb számomra.)
    Mutasd a teljes hozzászólást!
  • Szerintem remekul haladsz. A host nyelv meg teljesen mindegy, a lenyeg, hogy dll-t tudjon hivni es NEKED kenyelmes legyen.
    Az opengl fixed pipeline - amiben komplex dolgok vannak, de a shadow mar csak darabokban kerult bele - napjainkban mar csak egy emulacio: a hatterben az is shadereket futtat. Regen en is odzkodtam tole, de aztan megszerettem. A fixed pipe 10 eve megallt fejlodni. Pl a jatekban siman tudnal phong shadinget hasznalni, a matekjat is megertened, viszont nincs olyan, hogy glShadeModel(GL_PHONG), helyette viszont a pixel shaderbol tudsz dot productot szamolni.
    Egy masik pelda: gl line strippel megadsz egy nyomvonalat, ami alapjan a geometry shader meg menet kozben kiszamolja es texturazza a sineket, talpfakat meg a töltést.
    Más szemlelet, de nem hiaba lett ez a mainstream :D
    Mutasd a teljes hozzászólást!
  • Köszönöm, egy kis biztatás mindig jól esik! Jó dolgokat írsz róla egyszer talán eljutok odáig is.
    Mutasd a teljes hozzászólást!
  • Kipróbáltam hogyha DisplayList helyett VertexArray-ba pakolom a dolgokat az gyorsít-e?
    Annyira lassú hogy hihetetlen a CPU használat kb 50 szere lett! :(
     Valamit lehet nem jól csinálok mert ez nagyon soknak tűnik, még ha sima begin-end triangles-be teszem az is gyorsabb.
    Kipróbáltam már többféleképpen is de mindig ez az eredmény. Jól megjelenik minden de Array-ból kirakva iszonyat lassan. Ez a kirajzoló kódom:

    glEnableClientState GL_VERTEX_ARRAY glEnableClientState GL_NORMAL_ARRAY glEnableClientState GL_COLOR_ARRAY glVertexPointer 3, GL_FLOAT, 0, VAVertices(0).xyz(0) glNormalPointer GL_FLOAT, 0, VANormals(0).xyz(0) glColorPointer 3, GL_FLOAT, 16, VAColors(0).xyzw(0) glDrawArrays GL_TRIANGLES, 0, UBound(VAVertices) glDisableClientState GL_VERTEX_ARRAY glDisableClientState GL_NORMAL_ARRAY glDisableClientState GL_COLOR_ARRAY
    Mutasd a teljes hozzászólást!
  • Igen, mert most ez olyan, mintha minden frame-nal gl_compile-t nyomnal a listanak.

    Mindenkeppen használj Vertex Buffer Object-eket!
    Mutasd a teljes hozzászólást!
  • Természetesen  sokat az se segít rajta ha listába teszem. Ha ez ilyen lassú művelet akkor nem értem a létjogosultságát. Milyen helyzetben volt érdemes használni? A VBO kb egyforma sebességű a fixed listtel azt olvastam csak bonyolultabb és állapotokat nem lehet benne állítani. Gondolom a shderek miatt érdemes használni.
    Mutasd a teljes hozzászólást!
abcd