Forum | | | | - page 1 - |
| Sven Bader | Salut,
OpenGL dans XProfan pouvoir richtig Amusement, avec einer l'affaire suis je mais encore pas entier zufrieden. je hätte volontiers glatte Kanten (Antialisasing). quoi on so im Netz findet sommes qui Anleitungen eigentlich toujours juste et bien dans XProfan nachzustellen, malheureusement wird aussi entre den Polygonen, qui eigentlich zusammengehören geglättet - cela führt trop Löchern j'ai déjà probiert, avec StartList/Endlist/Drawlist Dinge trop gruppieren, aussi habe je testweise grand Teile des Codes avec API Aufrufen ersetzt.
peut-être passiert im Init-Befehl quelque chose, dass sich pas avec cela verträgt?
Hat sich de euch Schonmal quelqu'un avec dem Thema befasst? je fände es aussi pour Jeux avec einfacher Grafik droite wichitg, es est irgendwie en supplément.
Viele Grüße Sven
Im wesentlichen ist cela qui Code, qui den Objekten vorangestellt volonté muss:
un lauffähiges Komplettbeispiel ist ici, avec Leertaste peut sich qui Glättung à et ausschalten:
'$H OpenGL.ph
Def &GL_POLYGON_SMOOTH $B41;
Def &GL_NICEST $1102;
Def &GL_ONE_MINUS_SRC_ALPHA $303;
Def &GL_SRC_ALPHA $302;
Def &GL_POLYGON_SMOOTH_HINT $C53;
Def &GL_ONE 1;
Def &GL_BLEND 3042;
proc DrawGLScene
oGL("Clear")
oGL("Color", 1,1,1,1)
si (aa% = 1)
oGL("glBlendFunc",&GL_SRC_ALPHA, &GL_ONE_MINUS_SRC_ALPHA)
oGL("glEnable", &GL_BLEND)
oGL("glEnable", &GL_POLYGON_SMOOTH);
oGL("glHint", &GL_POLYGON_SMOOTH_HINT, &GL_NICEST);
d'autre
oGL("glDisable",&GL_POLYGON_SMOOTH)
oGL("glDisable", &GL_BLEND)
oGL("glBlendFunc",&GL_ONE, &GL_ONE)
endif
oGL("Origin", 0, 0, -4.0)
oGL("Rotate", 0, 0, 22.5)
oGL("Origin", -1.0, 0, -4.0)
oGL("Quad", 2, 2)
oGL("Origin", 1.0, 0, -4.0)
oGL("sphere", 1,20,20)
oGL("Show")
endproc
declare ende%, aa%
window 600,400
oGL("Init", %hWnd, 0.5, 0.5, 0.5, 0)
oGL("PosMode", 1)
aa% = 1
DrawGLScene()
ende% = 0
WhileNot ende%
WaitInput
si (%clé = 32)
sleep 200
aa% = abs(aa% - 1)
elseif (%clé = 27)
ende% = 1
endif
DrawGLScene()
Endwhile
oGL("Done")
end
Antialiasing AN, qui Ränder sommes ok, mais alle Schnittkanten avons Löcher
Standardzustand Antialiasing AUS, Schnittkanten ok, mais aucun Glättung
Hack: Anti Aliasing per Grafiktreiber erzwungen, so sollte es air
|
| | | | |
| | « cette Beitrag wurde comme Solution gekennzeichnet. » | | Sven Bader | Pour mon Zwecke habe je une Solution, qui malheureusement dans chaque quelque chose komplexerem Umfeld échouer wird.
je lege sur cela ungeglättete objet ....
... cela avec den glatten Kanten ...
... cela Ergebnis ist comment gewüsncht
Zum une ist es faux et unperformant cela ganze objet encore einmal trop zeichnen, zum anderen peux cet Methode trop anderen Problemen mener si cela objet aucun "culled faces" alors unsichtbare Rückseiten hätte ou bien jamais pour Beschaffenheit des Objekts Teile de sich selbst par qui Löcher sieht. aussi Kombination avec transparenten Objekten sorgt chez cette Solution pour Durcheinander.
intéressant trop voyons ist, dass cela Originalobjekt quelque chose kleiner ist et qui Glättung außen en supplément venez - là fragt on sich, comme überhaupt le Löchern im Innenbereich venez ...
une Interessante variante ist angwendetes Smoothing mais avec deaktiviertem Blending, so bekommt on cela "größere" objet, mais cela seulement am Rande.
Liegt qui Solution simple seulement dans qui richtigen glBlendFunc(), quelle letztendlich cela tut, quoi je avec deux identischen Objekten nachbilde ou bien peux es quelque chose avec Buffern ou bien oGL Grundeinstellungen trop 1faire avons?
ici qui neue Code
$H OpenGL.ph
proc DrawGLScene
oGL("Clear")
oGL("Color", 1,1,1,1)
si (aa%)
oGL("glDisable", ~GL_BLEND)
oGL("glDisable", ~GL_POLYGON_SMOOTH)
'objet avec harten Kanten
oGL("Push")
oGL("Rotate", 0, 0, 22.5)
oGL("Origin", -1.0, 0, -4.0)
oGL("Quad", 2, 2)
oGL("Origin", 1.0, 0, -4.0)
oGL("sphere", 1,30,30)
oGL("Pop")
oGL("glBlendFunc",~GL_SRC_ALPHA, ~GL_ONE_MINUS_SRC_ALPHA)
oGL("glEnable", ~GL_POLYGON_SMOOTH)
oGL("glEnable", ~GL_BLEND)
'Gleiches objet geglätten par-dessus
oGL("Push")
oGL("Rotate", 0, 0, 22.5)
oGL("Origin", -1.0, 0, -4.0)
oGL("Quad", 2, 2)
oGL("Origin", 1.0, 0, -4.0)
oGL("sphere", 1,30,30)
oGL("Pop")
d'autre
oGL("glDisable", ~GL_BLEND)
oGL("glDisable", ~GL_POLYGON_SMOOTH)
oGL("Push")
oGL("Rotate", 0, 0, 22.5)
oGL("Origin", -1.0, 0, -4.0)
oGL("Quad", 2, 2)
oGL("Origin", 1.0, 0, -4.0)
oGL("sphere", 1,30,30)
oGL("Pop")
endif
oGL("Show")
endproc
declare ende%, aa%
window 600,400
oGL("Init", %hWnd, 0.5, 0.5, 0.5, 0)
oGL("PosMode", 1)
oGL("glHint", ~GL_POLYGON_SMOOTH_HINT, ~GL_NICEST);
ende% = 0
aa% = 1
DrawGLScene()
WhileNot ende%
WaitInput
si (%clé = 32)
sleep 200
aa% = abs(aa% - 1)
elseif (%clé = 27)
ende% = 1
endif
DrawGLScene()
Endwhile
oGL("Done")
end
|
| | | | | |
| | Sven Bader | j'ai den Beitrag comme gelöst deklariert quoique es aucun perfekte Solution gibt.
c'est wohl simple so, dass qui ursprüngliche Possibilité sur GL_POLYGON_SMOOTH de heutigen Grafiktreibern pas plus korrekt behandelt wird et on sur zeitgemäßere (et komplexe) Technologien zurückgreifen sollte. une Lösungsansatz avec oldschool OpenGL wäre encore cela mehrfache léger versetzte Rendern dans den Accumulation Buffer (glAccum), den habe je aussi déjà erfolgreich pour Motion Blur verwendet. |
| | | | |
|
répondreOptions du sujet | 2.674 Views |
Themeninformationencet Thema hat 1 participant: |