2010-09-03 13 views
6

Ich benutze OpenGL, um einige GPGPU-Berechnungen durch die Kombination eines Vertex-Shaders und eines Fragment-Shaders durchzuführen. Ich muss Berechnungen auf einem Bild in unterschiedlichem Maßstab durchführen. Ich würde gerne Mipmaps verwenden, da ihre Generierung automatisch und hardwarebeschleunigt sein kann. Ich bekomme jedoch keinen Zugang zu den Mipmap-Texturen im Fragment-Shader.Wie kann man in einem GLSL-Fragment-Shader auf eine bestimmte Mipmap-Ebene zugreifen?

Ich aktiviert automatische Mipmap-Generierung: glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

Ich versuchte mit Textur2DLod im Shader ohne Glück, es gab einfach die normale Textur. Ich habe auch versucht, glTextureParameteri (GL_BASE_LEVEL, X) im Hauptprogramm und es hat nichts geändert.

Wie würden Sie das tun?

Ich benutze Linux. Meine Grafikkarte ist eine Nvidia Quadro ziemlich alt. Here ist meine glxinfo-Ausgabe mit allen unterstützten Erweiterungen.

+0

I upvote Ihre Frage, weil es "nützlich und klar" ist, aber Sie scheinen alles gut zu machen. Was sagt glTextureSize (Sampler, lod)? (In Ihrem Fragment Shader) – Calvin1602

+0

Es gibt keine solche Funktion für mich. Ich denke meine Karte ist zu alt (ich habe gerade überprüft und die Version von GLSL ist GL_ARB_shading_language_100). Das würde viel erklären, aber ich verstehe nicht, warum der Shader die * Lod-Variante akzeptiert, ohne sich zu beschweren, wenn sie nicht unterstützt wird ... – Jim

+0

Ich verstehe auch nicht, warum glTextureParameteri (GL_BASE_LEVEL, X) und glTextureParameteri (GL_MAX_LEVEL, X) Anrufe haben auch keine Wirkung. Das ist nicht GLSL-bezogen ... Ich bin gerade ziemlich verwirrt. – Jim

Antwort

3
gvec4 textureLod (gsampler1D sampler, float P, float lod) 
gvec4 textureLod (gsampler2D sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler3D sampler, vec3 P, float lod) 
gvec4 textureLod (gsamplerCube sampler, vec3 P, float lod) 
float textureLod (sampler1DShadow sampler, vec3 P, float lod) 
float textureLod (sampler2DShadow sampler, vec3 P, float lod) 
gvec4 textureLod (gsampler1DArray sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler2DArray sampler, vec3 P, float lod) 
float textureLod (sampler1DArrayShadow sampler, vec3 P, float lod) 

Haben Sie einen dieser eingebauten? Auch lod muss ein Float-Typ sein. Welche Fehler/Warnungen melden den GLSL-Compiler?

+0

Hallo, Entschuldigung für die lange Verzögerung. Ich habe die Funktion texture2DLod ausprobiert. Das Seltsame ist, dass egal welchen Wert ich 'lod' gebe, der zurückgegebene Wert ist genau der selbe wie bei der Standard-texture2D-Suche. Bei der Shader-Kompilierung werden keine Fehler oder gar Warnungen erzeugt. – Jim

1

Versuch:

glGenerateMipmapEXT(GL_TEXTURE_2D); 

, nachdem Sie die Textur binden. (Und bevor die Wiedergabe natürlich tun)

Die glTexParameteri-GL_GENERATE_MIPMAP ist Ich denke, veraltet ... MfG Digi

1

Die GLSL 1.20 Spezifikation (Abschnitt 8.7) besagt, dass Fragment-Shader können nicht ihre eigenen Mipmapstufe wählen (und das Die Textur * Lod-Funktion ist nur in Vertex-Shadern verfügbar. Wenn überhaupt, können Sie den Parameter "bias" für die Nicht-Lod-Varianten verwenden, um die Mipmap-Ebene zu ändern, aber Sie können sie nur im Verhältnis zu dem ändern, was die Karte bereits für Sie berechnet hat.

Ich weiß nicht, ob letztere Versionen von GLSL das geändert haben können.

+0

In der Tat haben sie das geändert, wie die erste Antwort auf diese Frage gezeigt hat. –