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

Aktuelle Zeit: Fr Jul 18, 2025 04:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 12:08 
Offline
DGL Member

Registriert: Fr Okt 08, 2010 15:07
Beiträge: 4
Hallo !

Mein kleines Rennspiel besitzt ein Terrain, welche sich zu nutzen macht, dass für viele Texturen eigentlich ein Graustufen-Bild ausreicht, welches dann jeweils passend eingefärbt wird. Daher habe ich in jeden Kanal eines Bildes ein unabhängiges Graustufenbild reingequetscht, welches dann der Fragmant-Shader dann zum Gewünschten Bild wieder zusammen fügt:
Code:
outColor = (texture(texture0, texCoord0.st).g * texture(texture0, texCoord0.st*16.0).b * vec4(0.68, 1.00, 0.32,1.0)
 + (1.0-texture(texture0, texCoord0.st).g) * texture(texture0, texCoord0.st*64.0).r * vec4(0.8, 0.8, 0.8,1.0));
   outColor.a = 1.0f;

Dies liefert mir folgendes Bild:
http://users.ph.tum.de/gu92jiq/images/racer_1.png (Ohne Auto natürlich ;) )

Wenn ich die Textur, allerdings mit mipamps versehe:
Code:
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
      gluBuild2DMipmaps(GL_TEXTURE_2D, bAlpha ? GL_RGBA8 : GL_RGB8, NewTexture.width,
                      NewTexture.height, GL_RGB, GL_UNSIGNED_BYTE,
                 data);

Bekomm ich folgendes unschönes Bild:
http://users.ph.tum.de/gu92jiq/images/racer_2.png

Kann mir da jemand weiterhelfen ?
Ich bin recht neu auf dem Gebiet der OpenGL-Programierung

Vielen Dank schonmal im vorraus !

Mit freundlichen Grüßen,
matthias

PS. Ich hoffe es stört sich hier niemanden daran, dass ich mein Programm in C++ geschrieben habe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 12:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
PS. Ich hoffe es stört sich hier niemanden daran, dass ich mein Programm in C++ geschrieben habe.

Kein Problem, ungefähr 50% der Leute hier arbeiten nicht mit Delphi oder Pascal...

Zum eigentlichen Fehler. Ich zitiere mal aus dem Common Mistakes FAQ von OpenGL.org:
Zitat:
gluBuild2DMipmaps
Never use this. Use either GL_GENERATE_MIPMAP or the glGenerateMipmap function.

Also z.B. so setzen bevor du die Textur an OpenGL übergibst.
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 14:15 
Offline
DGL Member

Registriert: Fr Okt 08, 2010 15:07
Beiträge: 4
Vielen Dank für die schnelle Antwort Coolcat. Das hat tatsächlich geklappt. Kommt nicht oft vor, dass ein kleiner Codeschnipsel besser funktioniert ein Komplexerer.

Nur ne kleine Verständisfrage am Rande:

Woher weiß OpenGL intern eigentlich, welches Mipmap-Level es im Moment für den Rendervorgang verwenden soll ? Der Shader frägt ja nur dem sampler nach dem Wert der Textur an einer bestimmten Koordinate.
Bzw. kann man da extern irgendwie Einfluss drauf nehmen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 16:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Woher weiß OpenGL intern eigentlich, welches Mipmap-Level es im Moment für den Rendervorgang verwenden soll ? Der Shader frägt ja nur dem sampler nach dem Wert der Textur an einer bestimmten Koordinate.

Es wird die lokale Ableitung der Texturkoordinaten berechnet bzw. approximiert. Das geht über Forward- bzw. Backward Differencing, also die Differenz zum Nachbarpixel. Kann man in GLSL über die Funktionen dFdx() und dFdy() machen. Hier mal eine Funktion aus meinem Code die das nötige Mipmap-Level im manuell über den "Edge-compression"-Ansatz im Fragmentshader berechnet. Intern wird da was ähnliches passieren. Anzumerken ist das bei mir die Mipmaps umgekehrt nummeriert sind als in OpenGL üblich. uFullEdge ist die Kantenlänge der Textur in höchster Auflösung, uMaxMipmap ist die Mipmapstufe mit der höchsten Auflösung.
Code:
float calculateMipMap(const vec2 vtcoord) {
   vec2 dx = dFdx(vtcoord);
   vec2 dy = dFdy(vtcoord);
   dx *= dx;
   dy *= dy;
   float lod = sqrt(max(dx.s+dx.t,dy.s+dy.t)) * uFullEdge;
   float mipmap = log2(lod);
   mipmap = clamp(mipmap,0.0,uMaxMipmap);
   return uMaxMipmap-mipmap;
}

Mathematische Details findest du im Anhang A.2 dieser Bachelorarbeit, mein Code stammt auch von da:
http://www-i8.informatik.rwth-aachen.de ... low_03.pdf

Zitat:
Bzw. kann man da extern irgendwie Einfluss drauf nehmen?

Im Fragmentshader kannst ab GLSL 1.3 über die Funktion textureLod das Mipmap-Level manuell wählen, siehe GLSL Spec. Im Vertexshader ist es nicht möglich das Mipmaplevel automatisch bestimmen, daher musst du dort immer schon texture2DLod benutzen, wenn du was anderes als die höchste Auflösung willst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 19:04 
Offline
DGL Member

Registriert: Fr Okt 08, 2010 15:07
Beiträge: 4
Ah es hat also doch nix mit Magie zu tun.
Sind diese Funktionen dFdx() und dFdy() nicht sehr aufwändig für die GPU ? Weil hier ja mehr oder weniger eine neue Instanz des Pixelshaders angeworfen werden muss ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Sind diese Funktionen dFdx() und dFdy() nicht sehr aufwändig für die GPU ? Weil hier ja mehr oder weniger eine neue Instanz des Pixelshaders angeworfen werden muss ?

Wie das genau implementiert ist kann ich dir nicht sagen...das wissen wahrscheinlich nur diejenigen die entsprechende Chips entwerfen. Ich würde aber mal behaupten das ist irgendwie in den Rasterizer integriert: Wenn ein Fragment berechnet wird, ist die Wahrscheinlichkeit hoch das gerade auch ein Nachbarfragment berechnet wird. D.h. die Shaderunits können hier in gewissem Rahmen interagieren bzw. aufeinander warten.
Es ist auch möglich das einfach der Fragmentshader für den Nachbarpixel nochmals aufgerufen wird. Das ist ggf. schneller als auf das Ergebnis einer anderen Shaderunit zu warten.
=> In jedem Fall: Der Aufwand ist akzeptabel....ist würde es als ähnlich wie einen Texturzugriff einschätzen. Du darfst aber gerne mal ein paar Benchmarks ansetzen und die Ergebnisse hier posten. Dann hätten wird etwas solideres als meine wilden Vermutungen :P ;)
Als Test würde ich einen Fragmentshader vorschlagen der sagen wir 10000 pseudozufällige Texturzugriffe in einer Schleife macht (z.B. Farbwerte aufsummieren) und dann das Ergebnis in dFdx() bzw. dFdy() einleitet. Wenn eine eigene Instanz gestartet wird sollte das ca. doppelt solange dauern wie ohne dFdx() und dFdy(). Der Zufallszugriff und die große Zahl der Zugriffe ist wichtig um Caching-Effekte auszuschließen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Mipmapping
BeitragVerfasst: Mi Okt 13, 2010 20:19 
Offline
DGL Member

Registriert: Fr Okt 08, 2010 15:07
Beiträge: 4
Coolcat hat geschrieben:
Du darfst aber gerne mal ein paar Benchmarks ansetzen und die Ergebnisse hier posten. Dann hätten wird etwas solideres als meine wilden Vermutungen :P ;)


Ich glaube du überschätzt meine GLSL bei weitem. Im Moment müsst ich euch für jede Zeile Code hier Forum mit Fragen nerven. Evt. mach ich sowas mal später, wenn mir die Sprache geläufiger ist.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]