Español
Foro

OpenGL el Zweite: Anti Aliasing

 
- 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:
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);

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




an.jpg  
27 kB
Bezeichnung:AA an
Hochgeladen:12.07.2021
Ladeanzahl66
Descargar
17 kB
Bezeichnung:AA aus
Hochgeladen:12.07.2021
Ladeanzahl66
Descargar
17 kB
Bezeichnung:AA über den Treiber erzwungen
Hochgeladen:12.07.2021
Ladeanzahl71
Descargar
13 kB
Hochgeladen:12.07.2021
Ladeanzahl69
Descargar
6 kB
Hochgeladen:12.07.2021
Ladeanzahl72
Descargar
5 kB
Hochgeladen:12.07.2021
Ladeanzahl60
Descargar
 
12.07.2021  
 



« 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

1.png  
4 kB
Bezeichnung:1
Hochgeladen:19.07.2021
Ladeanzahl74
Descargar
2.png  
4 kB
Bezeichnung:2
Hochgeladen:19.07.2021
Ladeanzahl73
Descargar
3.png  
4 kB
Bezeichnung:3
Hochgeladen:19.07.2021
Ladeanzahl62
Descargar
4.png  
4 kB
Bezeichnung:4
Hochgeladen:19.07.2021
Ladeanzahl79
Descargar
 
19.07.2021  
 




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.
 
07.09.2021  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

2.639 Views

Untitledvor 0 min.
Sven Bader07.03.2023
Alibre14.01.2023
Ernst29.05.2022
Thomas Zielinski07.10.2021
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

Sven Bader (3x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie