2017-11-08 6 views
0

Ich rendere eine Textur in opengl-es-2.0 unter einem großen Winkel in Bezug auf den Betrachter (eine Bodenebene). Auf Hardware, die anisotrope Filterung unterstützt, ist alles in Ordnung. Allerdings muss ich einige Geräte unterstützen, die diese Hardware nicht haben (kein GL_EXT_texture_filter_anisotropic).Alternative für anisotrope Filterung in Hardware

Mit Mipmap aus ist die Textur in der Ferne scharf, aber ich habe Moiré-Muster, wie erwartet. Mit Mipmap sind die Moiré-Muster verschwunden, aber die Textur ist in der Ferne verschwommen (wieder wie erwartet).

Gibt es eine alternative Hardware ohne anisotrope Filterung? Ist es machbar, dies im Fragment-Shader (OpenGL-es-2.0 nur fürchte ich) zu tun? Irgendein Beispielcode irgendwo? Ich fand http://www.pmavridis.com/ewa.html auf elliptischen gewichteten Mittelwert Filterung, die ich denke, könnte implementiert werden, aber der Beispielcode verwendet zugrunde liegende anisotrope Hardware-Filterung, und irgendwie verwendet viele Dinge, die nicht auf opengl-es-2.0 verfügbar.

Ich bin nicht auf hohe Bildraten, nur gute Bildqualität.

Antwort

2

Trilinear Filterung für Ihre Mipmaps verbessert die Dinge ein wenig:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 

Mipmap Bias die Schärfe verbessern. Es kann etwas Moire einführen, aber nicht annähernd so viel wie das Mipmapping überhaupt. Es ist vollbracht, indem eine andere Überlastung von Texture2D im Fragmente Shader

texture2D(yourSampler, yourTexCoords, yourMipBias); 

IIRC, ein Wert von -1 für yourMipBias wird schärft die Textursampling von 1 mip Ebene aufrufe, müssen Sie für Ihre Szene zu optimieren, aber etwas um -0,5 bis -1,5 könnte gut genug sein.

Ich glaube, es wäre möglich, Ihre eigene anisotrope Filterung im Shader zu schreiben, aber ich habe keine Erfahrung aus erster Hand davon. Ich würde diese einfacheren und effizienteren Ansätze zuerst ausprobieren, um zu sehen, ob Sie auf diese Weise eine anständige visuelle Qualität erhalten können.