Foro | | | | - Página 1 - |
| Sven Bader | ¡Hola,
OpenGL en XProfan macht correcto Spaß, con uno Sache bin Yo aber todavía no bastante zufrieden. Yo hätte gerne glatte Kanten (Antialisasing). Was uno así en el Netz findet son el Anleitungen eigentlich siempre igual y bien en XProfan nachzustellen, desafortunadamente se auch zwischen el Polygonen, el eigentlich zusammengehören geglättet - el führt a Löchern Yo habe ya probiert, con StartList/Endlist/Drawlist Dinge a gruppieren, auch Yo testweise große Teile des Codes con API Aufrufen ersetzt.
Tal vez passiert en el Init-Befehl algo, dass se no así verträgt?
Sombrero se de euch schonmal alguien con el Thema befasst? Yo fände lo auch para Juegos con einfacher Grafik bastante wichitg, lo gehört irgendwie dazu.
Viele Grüße Sven
Im wesentlichen es el el Code, el el Objekten vorangestellt voluntad muss:
Ein lauffähiges Komplettbeispiel es hier, con Leertaste lässt el Glättung a y 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)
if (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);
más
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
declarar ende%, aa%
window 600,400
oGL("Init", %hWnd, 0.5, 0.5, 0.5, 0)
oGL("PosMode", 1)
aa% = 1
DrawGLScene()
ende% = 0
Sinestar encargado ende%
WaitInput
if (%key = 32)
sleep 200
aa% = abs(aa% - 1)
elseif (%key = 27)
ende% = 1
endif
DrawGLScene()
EndWhile
oGL("Done")
end
Antialiasing AN, el Ränder son ok, aber todos Schnittkanten haben Löcher
Standardzustand Antialiasing AUS, Schnittkanten ok, pero no Glättung
Hack: Anti Aliasing por Grafiktreiber erzwungen, así debería lo aussehen
|
| | | | |
| | « Dieser Contribución wurde como Solución gekennzeichnet. » | | Sven Bader | Für mi Zwecke Yo una solución, el desafortunadamente en cada algo komplexerem Umfeld scheitern se.
Yo lege el ungeglättete Objeto ....
... el con el glatten Kanten ...
... el Ergebnis es como gewüsncht
Zum una es falso y unperformant todos Objeto todavía una vez para dibujar, para otro kann esta Método a otro Problemen führen si el Objeto no "culled faces" also unsichtbare Rückseiten hätte oder una vez después de Beschaffenheit des Objekts Teile de se incluso por el Löcher sieht. Auch Kombination con transparenten Objekten sorgt en dieser Solución Durcheinander.
Interessant a sehen es, dass el Originalobjekt algo kleiner es y el Glättung außen dazu kommt - como fragt uno se, como überhaupt a Löchern en el Innenbereich kommt ...
Un Interessante Variante es angwendetes Smoothing aber con deaktiviertem Blending, así bekommt al "größere" Objeto, aber el sólo al Rande.
Liegt el Solución simplemente sólo en el richtigen glBlendFunc(), welche letztendlich el tut, Yo con zwei identischen Objekten nachbilde oder kann hay algo con Buffern oder oGL Grundeinstellungen a tun haben?
Hier el neue Code
$H OpenGL.ph
proc DrawGLScene
oGL("Clear")
oGL("Color", 1,1,1,1)
if (aa%)
oGL("glDisable", ~GL_BLEND)
oGL("glDisable", ~GL_POLYGON_SMOOTH)
'Objeto con 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 Objeto geglätten darüber
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")
más
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
declarar 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()
Sinestar encargado ende%
WaitInput
if (%key = 32)
sleep 200
aa% = abs(aa% - 1)
elseif (%key = 27)
ende% = 1
endif
DrawGLScene()
EndWhile
oGL("Done")
end
|
| | | | | |
| | Sven Bader | Yo habe el Contribución como gelöst deklariert obwohl lo no perfekte Solución son.
Es wohl simplemente así, dass el ursprüngliche Möglichkeit encima GL_POLYGON_SMOOTH de heutigen Grafiktreibern no mehr korrekt behandelt se y uno en zeitgemäßere (y komplexe) Technologien zurückgreifen debería. Un Lösungsansatz con oldschool OpenGL wäre todavía el mehrfache ligeramente versetzte Rendern en el Accumulation Buffer (glAccum), el Yo auch ya erfolgreich para Motion Blur verwendet. |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 1 subscriber: |