Autor Téma: FMX 3D rendering - problem s Context.DrawTriangles  (Přečteno 272 krát)

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 528
  • Karma: 20
    • Verze Delphi: D2007, D10.4
FMX 3D rendering - problem s Context.DrawTriangles
« kdy: 25-08-2022, 17:41:38 »
Zdravim, je tu niekto z vas guru na 3D vykreslovanie cez FMX TViewport3D.

Robim len nejake edukacne ukazkove veci ktore mi na GLscene nerobia ziaden problem, ale v tom nativnom FMX 3D engine to funguje pre mna neocakavanym sposobom.

Problem mam s funkciou
Kód: Delphi [Vybrat]
  1. Context.DrawTriangles(...)
, vec sa ma tak ze ten Viewport3D mi ten trojuholnik aj vykresli, ale len z jednej strany. Ked okolo neho beham s kamerou tak z druhej strany je priesvitny. GLscene mi toto nerobi, trojuholnik, resp polygon je proste pekne vykreslovany z obidvoch stran.

Problem je v tom ze ked si pomocou mojej funkcie vypocitam jednotlive trojuholniky napriklad pre icoshaderon (tusim dvadsat sten po ceskoslovensky) a len zaradom dam vykreslit tie trojuholniky tak to teleso je derave jak cednik. Lebo niektore jeho trojuholniky su vykreslene zvnutra telesa a zvonku su priehladne.

Ak by som to hcel opravit, tak by som najprv musel identifikovat ktore presne trojuholniky su opacne a len zmenit poradie vrcholov trojuholnika ktore do tej funkcie DrawTriangles sypem. To mi pride ako hodne netradicne az pofiderne spravanie.

Pretoze fajn, icoshaderon ma 20 trojuholnikov, ale taka icosphere moze mat tisice trojuholnikov, co uz bude na palicu. Navyse v GLscene ked kamerou vojdem dovnutra toho icoshaderonu, tak ho pekne vidim aj z vnutra, ale ked v tom FMX Viewporte3D vleziem dnuka tak sa cele teleso vlastne strati lebo tie trojuholniky z vnutornej strany su priesvitne.

Offline Slappy

  • Hrdina
  • ****
  • Příspěvků: 257
  • Karma: 12
  • Slappy
    • Verze Delphi: 11 Alexandria + Vsetky :)
    • unSigned
Re:FMX 3D rendering - problem s Context.DrawTriangles
« Odpověď #1 kdy: 26-08-2022, 18:32:05 »
A keby si vzdy kreslil trojuholnik dvakrat? Raz akoby z jednej strany a potom v opacnom smere (z druhej strany).
Myslim, ze toto spravanie je standardne co sa tyka 3D grafiky (v hrach...)
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 528
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:FMX 3D rendering - problem s Context.DrawTriangles
« Odpověď #2 kdy: 27-08-2022, 18:49:14 »
A keby si vzdy kreslil trojuholnik dvakrat? Raz akoby z jednej strany a potom v opacnom smere (z druhej strany).
Myslim, ze toto spravanie je standardne co sa tyka 3D grafiky (v hrach...)

No toto by asi vyriesilo problem, ale mam pocit ze to nie je zrovna najsofistikovaniejsie riesenie, obzvlast ked tych trojuholnikov je fakt vela (sak povedzme si, v hrach su ich miliony ak nie miliardy). Ako pochopim ze pre rendering je asi efektivnejsie riesit len jednu stranu tych trojuholnikov. Ale potom by bolo dobre poznat ako matematicky uz dopredu ze ako vygenerovat jednotlive vrcholi tych trojuholnikov aby boli spravne orientovane voci stredu objektu.

Ale tuto teoriu uz nepoznam  :-\

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:FMX 3D rendering - problem s Context.DrawTriangles
« Odpověď #3 kdy: 28-08-2022, 10:45:32 »
Excellent
Rated 1 time
V OpenGL je na to GL_CULL_FACE.
Ve FMX jsem to sice nikdy nezkoušel, ale TContextState má mj. hodnoty csFrontFace, csBackFace, csAllFace. Přes TContext3D.SetContextState(const State: TContextState); by se to asi mělo dát nastavit.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 528
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:FMX 3D rendering - problem s Context.DrawTriangles
« Odpověď #4 kdy: 28-08-2022, 14:28:10 »
V OpenGL je na to GL_CULL_FACE.
Ve FMX jsem to sice nikdy nezkoušel, ale TContextState má mj. hodnoty csFrontFace, csBackFace, csAllFace. Přes TContext3D.SetContextState(const State: TContextState); by se to asi mělo dát nastavit.

Super idem vyskusat pripadne postudovat