Archiv verlassen und diese Seite im Standarddesign anzeigen : Texturen selbst filtern
Corrail
2004-05-23, 19:26:01
Hi all!
Da ja in letzter Zeit wieder viel über Texturefilterung geredet wurde, habe ich mir überlegt, ob man nicht selbst einen Texturfilter im Fragment Shader schreiben kann. Die Textur einfach auf Punktfilter stellen und mit dem Pixelshader (mit Hilfe von ddx und ddy bei DX bzw. mit dFdx und dFdy bei GLSL) den Filter selbst schreiben. Dann noch das LoD selbst wählen und man hätte seinen eigenen (100% korrekten) anisotropen Filter.
Meine Frage ist erstmal, geht das (unter Vorraussetzung, dass es die Hardware unterstützt)? Wenn es geht, unter welcher Hardware ist das möglich?
Und zweitens, inwiefern sich das auf die Performance auswirkt. Das echtes Original-AF schneller ist wage ich nicht zu bezweifeln, mich würde aber trotzdem interessieren inwiefern das langsamer ist.
Vielen Dank
Corrail
Corrail
2004-05-23, 19:33:42
BTW, hat irgendwer Erfahrung mit Rip-Mapping? Ich meine von der Qualität her. Wie ist Rip-Mapping zu vergleichen mit AF von NV bzw. ATI?
Brillus
2004-05-23, 20:09:27
Ich würde sagen Performencmassif wohl sowas wie Frames per Minute
D-Swat
2004-05-23, 21:28:11
Ich glaube nicht das sowas Möglich ist, weil man im Pixelshader AFAIK keinen Zugang zu den verschiedenen Textur LOD Stufen hat.
Um eigenes Filtering zu implementieren, müsste man die Entfernung zur Kamera wissen ( sollter per PS Parameter möglich sein )
um danach dann den richtigen Mipmap Level zu errechnen.
Dannach muss man die verschiedenen Mipmap Stufen von der Texture bekommen um diese zu interpolieren.
Und ich denke mal hier scheitert es.
Muh-sagt-die-Kuh
2004-05-23, 22:11:37
Original geschrieben von D-Swat
Ich glaube nicht das sowas Möglich ist, weil man im Pixelshader AFAIK keinen Zugang zu den verschiedenen Textur LOD Stufen hat.
Dannach muss man die verschiedenen Mipmap Stufen von der Texture bekommen um diese zu interpolieren.
Und ich denke mal hier scheitert es. Wieso? Selbst wenn man nur Zugriff auf die Basistextur hätte (ich weiss es ehrlich gesagt nicht), könnte man sich die MIP-Maps immer noch selbst generieren, das geht mit Pixel Shadern auf jeden Fall.
D-Swat
2004-05-23, 22:24:01
Ok wenn man alle Pixel aus der Texture ausliest ( oder zumindest alle relevanten ), ist ne Möglichkeit die ich net bedacht habe.
Die Frage ist dann, sind soviele Texture reads Möglich?
SAT's sind auch noch ne Möglichkeit, die man bedenken sollte.
Dafür findet man bei NV auch sogar en Paper irgendwo und man ist vom Mipmapping ganz weg :bäh:
Original geschrieben von D-Swat
Ok wenn man alle Pixel aus der Texture ausliest ( oder zumindest alle relevanten ), ist ne Möglichkeit die ich net bedacht habe.
Die Frage ist dann, sind soviele Texture reads Möglich? Man hat mit 2.0 nur 12 Temps :)
Texturfilterung "per Hand" sollte im Pixelshader prinzipiell möglich sein. Afaik kann man z. B. FP32-Texturen auf einem R300 im PS mindestens bilinear filtern.
Corrail
2004-05-24, 11:19:31
Texturfilterung "per Hand" sollte im Pixelshader prinzipiell möglich sein. Afaik kann man z. B. FP32-Texturen auf einem R300 im PS mindestens bilinear filtern.
Also binlinear ist sicher kein Problem, das hab ich selbst schon gemacht.
Die Frage ist nur, ob man auf mehrere Mipmaps zugreifen kann. In GLSL gibt es textuerXDLod Funktionen, die es ermöglichen die Mipmapstufe selbst zu wählen. Laut GLSL Spezifikation gibt es diese Funktionen nur im Vertex Shader. Frage ist, ob es von der Hardware oder in DX möglich ist.
SAT's sind auch noch ne Möglichkeit, die man bedenken sollte.
Hab mir das durchgelesen und auch die Rip-Maps ein wenig angeschaut. Das Problem bei denen ist aber, dass sie extrem starke Winkelabhängigkeit haben. 0° und 90° filtern sie perfekt, aber je nächer an 45°, desto schlechter sind diese Methoden.
Blutgrätsche
2004-05-24, 11:35:03
Wie kommt man an die 4 Texel? Muss man nicht erst 4 dependent texture loops drehen?
Corrail
2004-05-24, 11:42:22
Nope, hier wäre Beispiel für einen bilinearer Filter in GLSL:
const float TextureSize = 512;
const vec2 TexelSize = vec2(1.0 / TextureSize, 1.0 / TextureSize);
vec4 Sampels[4];
Sampels[0] = texture2D(BaseMap, TexCoord + TexelSize * vec2(0.0, 0.0));
Sampels[1] = texture2D(BaseMap, TexCoord + TexelSize * vec2(1.0, 0.0));
Sampels[2] = texture2D(BaseMap, TexCoord + TexelSize * vec2(0.0, 1.0));
Sampels[3] = texture2D(BaseMap, TexCoord + TexelSize * vec2(1.0, 1.0));
vec2 Weight = fract(v2f_TopLeft * TextureSize);
vec4 top = mix(Sampels[0], Sampels[1], Weight.xxxx);
vec4 bottom = mix(Sampels[2], Sampels[3], Weight.xxxx);
vec4 FinalColor = mix(top, bottom, Weight.yyyy);
Original geschrieben von D-Swat
Ich glaube nicht das sowas Möglich ist, weil man im Pixelshader AFAIK keinen Zugang zu den verschiedenen Textur LOD Stufen hat.
Um eigenes Filtering zu implementieren, müsste man die Entfernung zur Kamera wissen ( sollter per PS Parameter möglich sein )
um danach dann den richtigen Mipmap Level zu errechnen.
Dannach muss man die verschiedenen Mipmap Stufen von der Texture bekommen um diese zu interpolieren.
Und ich denke mal hier scheitert es.
Die Entfernung zur Kamera ist für die LOD-Auswahl direkt gar nicht relevant. Relevant ist nur, wie sich die Texturkoordinaten in Relation zu den Nachbarpixeln verändern. Sprich ddx und ddy auf die Texturkoordinaten. Und diese Berechnung führt die TMU automatisch aus. Man muss also den LOD gar nicht selbst wählen. Man kann ihn aber verändern (texldb in PS2.0) oder selbst angeben (texldl in PS3.0).
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.