Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 01:31

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sidorion hat geschrieben:
Wegen GL_CLAMP und GL_CLAMP_TO_EDGE: mbMn dehnt GL_CLAMP den letzten Pixel der Textur bis zum ende des Polys und GL_CLAMP_TO_EDGE lässt die Textur an ihrem Ende enden (also ab hier wird das Quad nicht mehr texturiert). Natürlich jeweils bei Texturkoordinaten >1 oder <0.


Das stimmt so nicht ganz. Also ich hab das hier gerade mal ausprobiert, zwischen GL_CLAMP und GL_CLAMP_TO_EDGE besteht der Unterschied für mich sichtbar nur in der Helligkeit der wiederholten Pixel: GL_CLAMP_TO_EDGE macht sie mit normaler helligkeit und GL_CLAMP nur mit halber oder so. Vielleicht liegts an meiner Graka, vielleicht auch an irgendwelchem Code, der in meiner Testumgebung noch läuft den ich vergessen habe.
Sicher ist aber: GL_CLAMP_TO_EDGE habe ich eigentlich immer verwendet, wenn ich wollte, dass die Textur vom ersten Pixel > 1.0 oder < 0.0 zum letzten Pixel der Textur an wiederholt wird.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Wozu gibt es Anleitungen, wenn sie dann doch keiner benutzt? ;)
OpenGL 2.1 Specs hat geschrieben:
Wrap Mode CLAMP
Wrap mode CLAMP clamps texture coordinates to range [0, 1].
Wrap Mode CLAMP_TO_EDGE
Wrap mode CLAMP_TO_EDGE clamps texture coordinates at all mipmap levels such
that the texture filter never samples a border texel. The color returned when clamping
is derived only from texels at the edge of the texture image.
Texture coordinates are clamped to the range [min, max]. The minimum value
is defined as
min = 1/(2N)
where N is the size of the one-, two-, or three-dimensional texture image in the
direction of clamping. The maximum value is defined as
max = 1-min
so that clamping is always symmetric about the [0, 1] mapped range of a texture
coordinate.


MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ah, also dafür ist die Border-Eigenschaft gut, wenn die Texturkoordinaten übers ziel hinausschießen bei GL_CLAMP.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 16:47 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Danke WhiteHunter für diese wertvolle Information. Ich habe inzwischen selber schon bemerkt, dass ich das mit CLAMP_TO_BORDER verwechselt habe.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 02, 2007 18:53 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
ich muß nun mal das alte Thema nochmal aufwärmen...
Zwischenzeitlich (ok hat ne weile gedauert) habe ich die Aufteilung in Tiles und deren Zeichnen umgestellt.
Das klappt nun auch mit dem Power of 2 und dem evtl. nicht vollständig Zeichnen des letzten Tiles ganz gut (wenn z.b. nur 150 Pixels in einer Texture sind = Texturkoordinaten bis 150/256).
Dazu verwende ich nun GL_CLAMP (da GL_CLAMP_TO_EDGE "erst" ab OpenGL 1.2 zu Verfügung steht. Leider ist 1.2 nicht in jeder OpenGL Implementierung drin).

Derzeit kann ich aber die hier angesprochene "Texture Seams" an den Enden oder Schnittstellen der Tiles nicht beobachten (obwohl ich keine Pixel wiederhole).
Trotzdem muß das der richtige Weg sein, da auch an anderen Stellen im Internet auf das Problem hingewiesen.
Warum aber sehe ich das Problem bei mir nicht? Habt ihr dafür Beispiele wie ich sowas provozieren kann?

Nun die wichtigen Fragen:
- In welchen Tiles der Texturen muß ich den Rechten+Unterene Rand noch mal wiederholen (wie von LossyEx richtig gesagt)?
* Immer - auch in Innenliegenden Tiles?
* Nur in den Letzten Teiles?
* Nur in den Letzten Tiles, wenn diese Non Power of 2 sind?
- Tiles und Zoomen - Überschneidung: LossyEx - Wie meinst du das exakt?
* Komplett umlaufend einen Pixel überschneiden (beim dem aktuellen Tile und auch dem davor und danach? (also insgeamt 2 Pixel Überschneidung - eins davor und eins vom aktuellen Tile)
* Texturkoordinaten an den Überschneidungen dürften nicht bis zum Rand der Pixel (also 0 oder 1) gehen sondern nur bis zur Mitte der Pixel: Wie ist das gemeint? Gib mal bitte mal ein Beispiel. Am Ende Zeichne ich doch keine halben Pixel, oder?

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 02, 2007 20:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
user69 hat geschrieben:
Dazu verwende ich nun GL_CLAMP (da GL_CLAMP_TO_EDGE "erst" ab OpenGL 1.2 zu Verfügung steht. Leider ist 1.2 nicht in jeder OpenGL Implementierung drin).

Passt zwar nicht ganz zur topic, aber hast du mal darüber nachgedacht, was dein ganzer anderer Code vorraussetzt??

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 03, 2007 10:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
OpenGL 1.2: Also da muss ich ganz ehrlich gestehen. Wenn es nicht auf der Softwareimplementation von Windows laufen soll, dann ist OpenGL 1.3 eigentlich schon wirklich überall verfügbar. Und da selbst 10 Jahre alte Karten bereits OpenGL 1.3 können würde ich mich nicht zu stark einschränken lassen. Zu mal du bei solch alten System mit dem verfügbaren Speicher schon Probleme bekommen könntest.

Filterung: Dazu evtl etwas mehr Hintergrund. Bei der Darstellung von Flächen werden die Texturkoordinaten für die jeweils sichtbaren Pixel berechnet und anschließend wird der Wert an dieser Stelle der Textur ausgelesen. Und an der Stelle solltest du dich von "Pixel (Texel) sind das Kleinste was es gibt" lösen. Denn wenn die berechneten Koordinate zwischen den Mittelpunkten zweier Texel (Pixel der Textur) liegt, dann wird zwischen den beiden Werten interpoliert. Provozieren kannst du es in dem du diese Fläche größer skalierst (ab 2 aufwärts). Denn dann liegen die berechneten Koordinaten zwischen den Texelmittelpunkten und es finden Verläufe statt. Wenn du eine Textur aber Pixelgenau darstellst, dann spielt der Filter keine Rolle.

Wenn du die Texturen nicht skalieren musst, dann solltest du es auch nicht zu kompliziert machen. Dann würde ich die Filterung der Textur deaktivieren und die Pixel vollständig darstellen. Ich hatte mir das auch mal kurz angeschaut, weil ich das später irgendwann auch mal brauchen werde (dann leider die richtig komplizierte Variante). Und es ist verworrender als ich zu Begin angenommen hatte. Zu mal es theoretisch auch nur beim größer Skalieren klappen müsste. Wenn die Textur kleiner wird ist es wiederrum etwas ganz anderes.

Die Pixelreihen oder Spalten, die du verdoppeln musst, sind die deren Texel komplett dargestellt werden müssen und wo sich die Texel am Rand des Bildes befinden. Innerhalb des Bildes würden ja nur halbe Texel gezeichnet werden und damit würde ja der Verlauf genau in der Mitte beginnen. Wenn der Verlauf aber bis zum Rand eines Texels geht dann muss das nächste Texel auch die Farbe haben. Also Verdoppelt. Wenn es der Rand einer Textur ist dann würde Clamp To Edge dafür sorgen, dass die Texturkoordinaten nicht über den Mittelpunkt des Texel gehen würden. Aber innerhalb der Textur ist ja kein Rand. Normal ist es also nur der Rechte und untere Rand des Bildes.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 03, 2007 19:38 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
OpenGL1.1: Wenn es nicht auf der Softwareimplementation von Windows laufen soll...
Perfekt erkannt, genau das soll es aber. Da Hardwarebschleunigung nicht immer sauber funktioniert (ich habe da schon genug diverse Probleme gesehen) lasse ich dem Benutzer die Wahl ob er Hardwarebeschleunigung oder einfach die Softwareimplementierung verwendet.

Tiles und Filter:
Lasst mich kurz zusammenfassen, ob ich alles richtig verstanden habe
Textur mit Border=0: glTexImage2D(GL_TEXTURE_2D, 0, 4, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pData)
Texturfilter und CLAMP: (CLAPM_TO_EDGE bringt ja auch kaum Vorteile, wenn ich die Pixel am Ende noch mal zeichne)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
Aufteilen in Tiles mit Power of 2 und diese Vollständig (0..1) als Texture nutzen; Die GL_QUADS dind dann z.B. 512x512.
Für letzes Tile in x und y (nur wenn nicht Vollständig gefüllt, z.B nur 0..150/256): Wiederholung der letzten Zeile und Reihe (inklusive Ecke) in der Texture, aber Zeichnen nur bis zur Originalgröße (GL_Quad ist dann 150 Punkte groß, die Texture ist 256 Punkte groß mit einem Bild von 151 Punkten drin). Wenn der Tile Power of 2 ist dann einfach vollständig Zeichnen ohne Anpassungen und Pixel Wiederholungen.

Zoom bei Nutzung von Tiles (Vergrößern und Verkleinern brauch ich leider auch):
Siehe folgendes Thema: http://www.sjbaker.org/steve/omniv/tiling_textures.html
Wenn ich das Richtig verstehe heißt das für mich:
- umlaufend je einen Pixel wiederholen (also bei jedem 512x512 Tile sind nur 510x510 Pixel am Ende genutzt. Umlaufend ist jeweils ein Pixel aus dem folgendem und vorhergehenden Tile mit in dem aktuellen Tile drin. Gezeichnet wird der GL_QUAD mit 510x510 Pixel und die Texturekoordinaten gehen von 1/512 bis 511/512).
Das sollte auch das sein, was Lossy eX am Anfang von Artikel geschrieben hat, oder?

Was haltet ihr davon ist das so richtig?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 03, 2007 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
OpenGL 1.1: Ich will nicht arg vom Thema abweichen. Allerdings ich persönlich vertrete da eine etwas andere Meinung. Also der Softwarerenderer ist keine Option. Da er seit 1996 Offenkundig Fehler enthält und im Vergleich zur ebenso alten Variante von SGI obendrein noch langsamer ist. Und da Software sowieso nicht schnell ist gäbe es für mich nur entweder vernünftige Hardware und da genügt 1.2 ja locker oder das Programm läuft eben nicht. Aber ich kann auch nicht abschätzen für welches Gebiet es gedacht ist. Nur bei mir gäbe es da keinen Spielraum. ;)

Tiles: Ja vom Prinzip her meinte ich es so ähnlich. Allerdings ist es so wahrscheinlich einfacher. Diese Methode ist etwas anders als was ich machen wollte. Hat aber einen Konstanten verschnitt bei der Texture ist dafür aber einfacher zu handhaben. Grob gesagt ist folgendes zu tun. Nur ums noch mal zu wiederholen. Das stimmte schon was du gesagt hattest.
- Jede Textur enthält einen 1 Pixel Rand. Entweder wird das äußerste Texel verdoppelt oder eben aus der nächsten Textur.
- Beim Zeichnen müssten dann nur noch die Flächen (510x510) direkt nebeneinander gezeichnet werden.

Du hast im übrigen mit GL_NEAREST die Filterung der Textur deaktiviert. Wenn du also Zoomst wird also nicht mehr interpoliert. Die Technik sollte das aber eigentlich erlauben. Der Wrapmodus ist eigentlich egal, da ja kein richtiger Rand mehr gezeichnet wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 04, 2007 23:24 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Texture:
Besten Dank, ich habs nun so wie oben umgebaut (etwas kompliziert wegen den ganzen verdoppen = kopierereien) aber es funktioniert so nun recht gut. Der Tip mit GL_NEAREST war noch echt gut. Darauf hatt ich garnicht geachtet.

OpenGL 1.1: Ich finde es immer besser jemanden die Chance zu lassen auch den Software Renderer zu lassen, als etwas vorzuschreiben, was nicht immer besser ist. Ich habe bisher die Erfahrungen gemacht daß der Softwarerenderer stabiler läuft, als einige der Hardwarebeschleunigungen (wo ich unschöne Effekte über nicht erkennbare Darstellungen, bis hin zu reboots gesehen habe). Welche offenkundigen Fehler vom Softwarerenderer sind denn bekannt? Gibt es da Quellen im Internet?
Sollten wir dazu ein neues Thema machen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 05, 2007 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
OpenGL 1.1:
Auch wenn es gerade ein vollkommen anderes Thema ist bzw. zu einem wird. ;)

Der Software Renderer hat Probleme, wenn man ein Doublebuffered Viewport in der Größe verändert. Ab einer gewissen Größe ändert sich die dargestellte Viewportgröße nicht mehr. Tipp von Microsoft. Man solle doch einfach auf ein Bitmap rendern. Damit erhält man dann bei einem einzelnen farbigen Quad auch so FPS von 1-2. Informationen dazu finden sich ind en Knowledge Base von Microsoft. Falls man, auf der Seite, überhaupt etwas findet. ;)

Größtes Manko ist aber einfach die extrem schlechte Performance. Selbst eine 10 Jahre alte Karte ist um ein vielfaches schneller als der Software renderer. Und die jenigen die mich schon länger kennen wissen, dass ich eigentlich immer dazu plädiere auch ältere Hardware zu unterstützen. Allerdings sehe ich so etwas dann eher als Fallback, in dem man dann einfach diverse Dinge nicht unterstützt. Aber den Code direkt gleich nur auf 1.1 auszulegen halte ich persönlich für taktisch unklug. Man muss auch immer unterscheiden wofür es gedacht ist. Meine Fonts laufen auch auf dem Software Renderer aber ich habe es nicht drauf angelegt und das was in OpenGL passiert ist mehr als trivial. ;) Allerdings kann ich grundsätzlich nur davon abraten diesen zu benutzen. Wenn die Hardware probleme macht sollte das repariert werden oder treiber neu installiert werden. Das bringt in der Regele viel mehr als die wahren Probleme zu umschiffen in dem man alles auf der CPU macht.

Ein extra Thema dafür anfangen was und wie bei dem Software Renderer zu beachten ist halte ich für nicht sinnvoll, denn vor 10 Jahren hätte ich noch gesagt okay. Aber heute nicht mehr. Seit 6-7 Jahren kann man eine Hardwarebeschleunigung vorraussetzen und wenn es damit Probleme gibt, dass ist es eigentlich Aufgabe des Besitzer des Rechners sich darum zu kümmern und nicht deine. Als referenz implementatiom zum Testen mag das okay sein. Dann aber doch lieber mesa gl als das ding von Microsoft. Aber als hauptrenderer immer hardware. ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]