Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

21.03.2010, 13:37

OpenGL: FBO bei Texturen mit 800x600 Texeln langsam

Hi,
Ich musste zu meinem Bedauern feststellen, dass OpenGL mit nicht "power of 2" Texturen - also Texture Größen wie z.B. 800x600 - auch bei FBO (FrameBufferObjects) bzw. RenderTargets nicht gut zurecht kommt.
Das sieht so aus, als würde OGL das dann einfach per Software emulieren. Kann aber nichts damit zu tun haben, dass das einfach zu groß wäre. Weil bei einer Auflösung von 1024x1024 - also 2^10 * 2^10 - gehts wieder schnell.
Bei Direct3D9 mit den RenderTargets ist das überhaupt kein Problem.
Oder muss man bei OGL da noch irgendwas mit den FBO beachten, damit das auch geht??
Bitte helft mir :(

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

21.03.2010, 14:25

Wenn die Grafikkarte keine NPot Texturen unterstützt muss GL halt emulieren, dann geht eben die Hardwareunterstützung verloren.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

21.03.2010, 14:54

Anscheinend ist OGL bei mir nur langsam, wenn ich das automatische MipMap Generieren aktiviert habe.
Wenn ich es deaktiviere, ist es auch dann schnell.
Das ist immer hin ein kleiner Vorteil, aber gerade für RenderTargets bzw. FBOs sind willkürliche Texture Größen schon praktisch, auch mit autom. MipMapGenerierung.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

21.03.2010, 14:56

Zitat von »"LukasBanana"«

Anscheinend ist OGL bei mir nur langsam, wenn ich das automatische MipMap Generieren aktiviert habe.
Wenn ich es deaktiviere, ist es auch dann schnell.
Das ist immer hin ein kleiner Vorteil, aber gerade für RenderTargets bzw. FBOs sind willkürliche Texture Größen schon praktisch, auch mit autom. MipMapGenerierung.


Du kannst ja auf die nächste POT Dimension aufrunden und die Koordinaten entsprechend setzen.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

21.03.2010, 15:15

Wie man das Problem lösen kann ist mir schon klar.
Aber es ist einfach praktischer und komfortabeler mit NPOT Texturen zu arbeiten. Und wenn man das feature hat (EVEREST sagt mir, meine GraKa unterstützt es), dann will ich eigentlich auch davon Gebrauch machen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

21.03.2010, 15:24

Zitat von »"LukasBanana"«

Wie man das Problem lösen kann ist mir schon klar.
Aber es ist einfach praktischer und komfortabeler mit NPOT Texturen zu arbeiten. Und wenn man das feature hat (EVEREST sagt mir, meine GraKa unterstützt es), dann will ich eigentlich auch davon Gebrauch machen.


Es ist für die Grafikkarte halt nicht einfach praktischer und komfortabler. Möglicherweisse hilft dir ARB_texture_rectangle.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

7

21.03.2010, 16:43

Ich hatte da vor einer Weile mal etwas drüber gelesen. Muss da grad mal was nachschauen...

So... so muss es aussehen:

Zitat

if( mSettings.mbMipMap )
{
GL_API_CALL("glGenerateMipmapEXT");
glGenerateMipmapEXT(Target);
}


Ich weiß nicht mehr genau von welcher Seite der Artikel war, auf jeden Fall stand dort, dass bei RenderToTexture das automatische Mipmap-Generieren absolut tödlich ist und dass es auch bei Texturen, die nur einmalig geladen werden, nicht mehr genutzt werden soll, sprich deprecated ist. Anstatt dessen solle man nach dem Laden einer Textur bzw. nach dem Abschließen des Updates via RenderToTexture obigen Befehl nutzen. Ich denke das Problem ist also bei 2^x Texturen genau so vorhanden., fällt dort halt nur nicht so auf, weil die sich natürlich deutlich schneller verkleinern lassen als nicht 2^x-Größen.

Probiers einfach mal aus, würde mich auch mal interessieren, wie groß der Unterschied ist.

Ansonsten gibt es glaube ich wenig darüber zu diskutieren, dass Non-2^x-Texturen, völlig egal ob sie von 90% der Grafikkarten unterstützt werden oder nicht, wirklich nur die absolute Ausnahme sein sollten.

LG
Alyx

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

21.03.2010, 17:29

Das ist die Funktion, die ich aufrufe wenn ich mit dem Rendern in die Texture fertig bin.

C-/C++-Quelltext

1
2
3
4
5
setRenderTarget(TargetTexture);

/* rendern ... */

setRenderTarget(0); // <- hier wird "glGenerateMipmapEXT" aufgerufen und auf die Texture des letzen render-targets angewandt ("TargetTexture")

Und genau das verursacht den enormen Performance Verlust, wenn es sich um eine NPOT Texture handelt ;)

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

9

21.03.2010, 18:48

Gerade mal etwas gegoogelt. Also laut Spezifikation wird es bei allen neueren Grafikkarten zumindest OpenGL-seitig offiziell unterstützt... was natürlich nicht heißt, dass sie es auch hardwareseitig schon tun, auch wenn mich das überrascht.

LG
Alyx

Werbeanzeige