[erledigt] gl-Texturfilter

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: [erledigt] gl-Texturfilter

BeitragSo, Nov 16, 2014 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche bereits seit einiger Zeit den korrekten Texturfilter zu finden, damit diese, sofern verkleinert, nicht so ausgefranzt aussehen. Hier mal nen Beispiel:

user posted image

Das linke Beispiel ist mit der Draw3D2 realisiert, das rechte mit BlitzMax

Beispiel-Code: [AUSKLAPPEN]
'BEIM LADEN
glDisable(GL_DEPTH_TEST)
glEnable(GL_TEXTURE_2D)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

'BEIM ZEICHNEN
glBindTexture GL_TEXTURE_2D,Handle
glBegin GL_QUADS
   glTexCoord2f(0,0); glVertex2f(X,Y)
   ...


Folgendes beim laden hat bei mir keinen Effekt:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)


---- ---- ---- [edit] ---- ---- ---- ---- ----

Irgendwie scheint es eine generelle Rendermethode bei BlitzMax oder GL zu sein, denn so weich aber auch etwas matschig sieht es nur bei Blitz3D aus. Schade trotzdem.

Im übrigen teste ich schon seit gestern 16:00 Uhr nonstop aus, was geht. Probiert habe ich PureBasic, NuvlearBasic und nun noch BlitzMax.

zu PureBasic: Sehr ausgereift, aber letztendlich für Leute, die 0815-Anwendungen programmieren. Sobald es ins Detail geht, wird es unnötig kompliziert. Desweiteren beträgt die höchste Auflösung die man mit 3D darstellen kann 2560 in X, danach ist Schluss.

zu NuclearBasic: Sehr schnell, so lange man die Beispieldateien testet. Will man ein wenig mit Vertices arbeiten, ist es bis zum Stillstand langsam. Höchste Auflösung dafür jenseits UHD (also mehr als 3840*2160 möglich). Dazu sehr einfache Integration von Shadern. Vielleicht wage ich noch ein Versuch.

zu BlitzMax: Sehr unausgereift. Dokumentationen sind Rar. Jeder frikelt für sich alleine rum, es gibt dazu kaum direkt ausführbaren Code zum Download. Es werden nur Zeilenweise Codebeispiele gepostet. Macht die Sache nicht einfach sich da rein zu arbeiten. Maximale Auflösung auch bei 3D mit UHD allerdings möglich.

zu Blitz3D: Veraltet und mit DirectX7 auch nicht besonders schnell. Da die maximale Auflösung hier nur noch 2048*2048 in 3D beträgt, kommt für mich Blitz3D nicht mehr in Frage. Ansonsten ist es super für Hobbyentwickler.

DAK

BeitragSo, Nov 16, 2014 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir nicht ganz sicher was dein Ziel ist.

Hast du schon probiert zum den GL_NEAREST-Filter zu verwenden? (Denke, der wird auch in BM so heißen, ist der Name den ich aus GL kenn)

Ansonsten könntest du dir auch relativ leicht einen Shader dafür schreiben, soweit ich weiß geht das in BM ja. Der Shader wäre ziemlich einfach und würde es dir erlauben eine Filterfunktion genau so zu schreiben wie du sie haben willst.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Kruemelator

BeitragMo, Nov 17, 2014 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute du Sampelst nicht genau auf den Pixeln sondern an deren Rändern.
Ich weis nicht genau ob es das Problem ist, aber das Bild sieht stark danach aus.
Hier ist eine Beschreibung für DirectX mit Bildern.
http://msdn.microsoft.com/en-u...85%29.aspx

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 18, 2014 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@ DAK

NEAREST ist ja im grunde eines der einfachsten Rendermethoden. Hier wird im grunde der nähste Texel genommen, der mit Übereinstimmung zum Bildschirmpixel steht. Ganz ohne Zwischenaufwand.

LINEAR ist wiederrum eine sehr einfache Form der Überlagerung verschiedener Farbwerten. Hier wird der Zwischenwert eines jeden Bildschirmpixel aus dem linearem Verlauf zwischen zwei Texeln berechnet.

Bei LINEAR erscheint es weicher, da mehr Informationen in den Bildschirmpixeln mit berücksichtigt werden. NEAREST hab ich bereits probiert, und dieses sieht dabei ja noch schlimmer aus. Das mit Shadern ist im übrigen eine sehr interessante Idee, die ich mal prüfen werden. Danke.

@ Kruemelator

Die Originaltextur hat 256x256 ARGB Pixel. Die Darstellung ist eben stark verkleinert und wird dabei gedreht. Ist im grunde nur ein einheitlicher Versuchsaufbau, denn ich nun mit Blitz3D, PureBasic, BlitzMax und NuclearBasic durchlaufen habe. Das Verschieben um 0.5 ist hier also irrelevant.

BlitzMax schafft im übrigen hier so um 2400 FPS, und Blitz3D nur 880 FPS. Die Darstellung ist unter Blitz3D dabei aber viel besser. Ob BlitzMax auch so langsam ist, wenn es die gleiche Qualität darstellen muss, kann ich noch nicht sagen. Sicherlich werden Shader das ganze auch verlangsamen.

Lange Rede kurzer Sinn, letztendlich möchte ich die Draw3D2 auf eine andere modernere Programmiersprache portieren. Die Draw3D2 (ich versuche jetzt zumindest nicht voreingenommen zu sein) ist eben sehr einfach in der Handhabung und ermöglicht viele Sachen, die unnötig nervig sein können wenn man ein Spiel programmiert. Es verzichtet auf unnötigen Schnickschnack alá "und jetzt der Spezialeffekt Numbero... 1001 - noch meeeeehr bunte Farben" und bietet Sachen die man braucht. Leider kann Blitz3D im 3D-Modus maximal 2048x2048 Bildschirmauflösung darstellen. Das nervt mich ungemein, sonst würde ich niemals wechseln. Aber wenn ich mir die Einschränkungen der anderen Sprachen ansehe, bleibe ich zuerst mal auf Blitz3D. Jede Programmiersprache hat ihre eigene Stärken und Schwächen, allerdings kommt keine auch nur ansatzweise an den Komfort von Blitz3D ran.

Auch interessant im anderen Forum: http://forums.nuclearglory.com/index.php?tid=5230 Leider konnte mir hier keiner wirklich Helfen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragDi, Nov 18, 2014 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
BlitzMax schafft im übrigen hier so um 2400 FPS
Mit welchem Grafiktreiber? Weiß nicht, was da standardmäßig genommen wird, aber man kann ihn explizit setzen:
BlitzMax: [AUSKLAPPEN]

gfx_Driver = GLMax2DDriver()
gfx_Driver = D3D7Max2DDriver()
gfx_Driver = D3D9Max2DDriver()
SetGraphicsDriver(gfx_Driver)
Graphics(...)

Womöglich schafft deine Grafikkarte mit einem anderen Treiber mehr?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 18, 2014 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab die Grafik mit GLGraphics initiiert.

Der gesamte Code, wie er bisher als Grundlage zum Versuchsaufbau in den verschiedenen Sprachen genutzt wurde:

Code: [AUSKLAPPEN]
Const DRAWDISTANCE:Int=200

'====-===-==-=-=--=---=----=---- --- -- - -  -   -    -

Function Clear3D(FDrawFace:Int=0)
   
   'OPENGL/EINSTELLUNGEN
   glLoadIdentity()
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
   gluLookAt(0,0,0, 0,0,-1, 0,1,0)
   
End Function
Function DrawImage3D(FDrawHandle:Int,FDrawX:Float,FDrawY:Float,FDrawAngle:Float=0,FDrawScale:Float=1)
   
   'HARDCODED/VORGABEN
   Local IDrawXRan#=32*FDrawScale
   Local IDrawYRan#=32*FDrawScale
   
   'EXTRA/WINKELBERECHNUNG
   Local IDrawTCos:Float=Cos(FDrawAngle)
   Local IDrawTSin:Float=Sin(FDrawAngle)
   Local IDrawXPos1:Float=IDrawXRan*IDrawTCos-IDrawYRan*IDrawTSin
   Local IDrawYPos1:Float=IDrawYRan*IDrawTCos+IDrawXRan*IDrawTSin
   Local IDrawXPos2:Float=IDrawXRan*IDrawTCos+IDrawYRan*IDrawTSin
   Local IDrawYPos2:Float=IDrawYRan*IDrawTCos-IDrawXRan*IDrawTSin
   
   'TEXTURANPASSUNG
   glBindTexture(GL_TEXTURE_2D,FDrawHandle)
   
   'QUAD/ZEICHNEN
   glBegin GL_QUADS
      glTexCoord2f(0,0); glVertex3f(FDrawX-IDrawXPos1,FDrawY+IDrawYPos1,-DRAWDISTANCE)
      glTexCoord2f(1,0); glVertex3f(FDrawX+IDrawXPos2,FDrawY+IDrawYPos2,-DRAWDISTANCE)
      glTexCoord2f(1,1); glVertex3f(FDrawX+IDrawXPos1,FDrawY-IDrawYPos1,-DRAWDISTANCE)
      glTexCoord2f(0,1); glVertex3f(FDrawX-IDrawXPos2,FDrawY-IDrawYPos2,-DRAWDISTANCE)
   glEnd
   
End Function
Function DrawInit3D(FDrawW:Float,FDrawH:Float,FDrawS:Int=0)
   
   'STANDARD/EINSTELLUNGEN
   GLGraphics(FDrawW,FDrawH,FDrawS)
   glMatrixMode(GL_PROJECTION)
   
   'OPENGL/EINSTELLUNGEN
   glScalef(2*DRAWDISTANCE/FDrawH,2*DRAWDISTANCE/FDrawH,1)
   gluPerspective(90,FDrawW/FDrawH,DRAWDISTANCE/2,DRAWDISTANCE*2)
   glMatrixMode(GL_MODELVIEW)
   
End Function
Function LoadImage3D(FDrawFile:String,FDrawMode:Int=2,FDrawBlend:Int=2)
   
   'VARIABLEN/VORBERECHNUNGEN
   Local IDrawKing:Int=GLTexFromPixmap(LoadPixmap(FDrawFile))
   
   'OPENGL/EINSTELLUNGEN
   glEnable GL_TEXTURE_2D
   glEnable GL_BLEND
   glBlendFunc GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA
   
   'FUNKTION/RÜCKGABEWERT
   Return IDrawKing
   
End Function

'====-===-==-=-=--=---=----=---- --- -- - -  -   -    -

DrawInit3D(1600,900)

Local Angle:Float
Local X:Int
Local Y:Int
Local Image1:Int=LoadImage3D("gis.png")

While Not KeyHit(KEY_ESCAPE)
   
   Angle:+0.1
   
   For Y=-9 To 9
      For X=-16 To 16
         DrawImage3D(Image1,X*40,Y*40,Angle+X*20+Y*20,0.5)
      Next
   Next
   
   DrawImage3D(Image1,0,0,Angle,2)
   
   'FPS>>>>>>>>
   GLDrawText FPS,20,20
   MSC=MilliSecs()
   If MSC>MTS Then
      MTS=MTS+1000; FPS=FRM; FRM=1
      If MSC=>MTS+2000 Then MTS=MSC
   Else FRM=FRM+1; End If
   'FPS<<<<<<<<<<<<<<<<<
   
   Flip 0
   If KeyDown(KEY_SPACE)=0 Then Clear3D()
Wend

Das Image, das genutzt wurde: user posted image
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Kruemelator

BeitragDi, Nov 18, 2014 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitz3D sampelt linear und nutzt MipMaps (triliniear). Außer Texturen die nur im VRam liegen, diese nutzten keine MipMaps. Die MipMaps könnten die besser Qualität erklären.

DAK

BeitragMi, Nov 19, 2014 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, mir war nicht klar was du als Ergebnis haben wolltest. Was Nearest, Linear und Cubic sind ist mir schon klar.

Kann einfach an OGL liegen, dass es da nicht so schön rendert. Probier's mal mit DirectX.

Was mir schon ein paar Mal untergekommen ist, ist dass der Grafiktreiber solche Sachen verpfuscht, da er denkt, er müsste was optimieren. Wenn du eine Nvidia- oder ATI-Karte hast solltest du in den Treibereinstellungen alles Mögliche an Optimierungen einstellen können. Die Intel-Treiber geben da nicht so viel her.

Ich hab das z.B. bei einem Projekt von mir gehabt, wo ich die Engine für das Spiel in OpenGL geschrieben habe (also von der Basis auf). Wenn ich das Spiel mit den gleichen Einstellungen auf meiner Intel HD 4000 starte, dann schaut es schlechter aus als wenn ich es auf meiner Geforce 635M laufen lasse.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group