Performancevergleich



  • Hallo zusammen
    Oftmals müssen ja Texturen zur Laufzeit generiert werden und ich frage mich in diesem Zusammenhang, ob es performanter ist, diese Textur zusammenzuschneidern, oder diese zu rendern. Ich habe in diesem konkreten Fall einige Bilder und muss diese auf der finalen Textur zusammensetzen. 3D - Rendering wäre also eigentlich nicht nötig. Hat jemand von euch Erfahrung mit solchen Dingen?

    Mfg Samuel



  • Hallo

    Textur zusammenzuschneidern, oder diese zu rendern

    Textur "zusammenzuschneiden" != Rendering.

    way



  • Zusammenschneidern hat er geschrieben, und meint damit vermutlich Pixel für Pixel zusammenbasteln und dann einfach hochladen.
    Was performanter ist kommt wahrscheinlich drauf an ob die "Stücke" schon im Video-RAM liegen, und wie oft die "Stücke" wiederverwendet werden.

    Wenn du 10 kleine Blöcke hast aus denen du grosse grosse Texturen zusammensetzt, dann is vermutlich viel schneller du lädst nur die 10 Blöcke hoch, und renderst die grossen Texturen dann über Direct3D.



  • Ich habe eine kleine Textur 256x256, welche 4 Blöcke (je 64x64) enthalten und ich welche ich natürlich ins VRAM laden kann. Ich muss daraus (einmal pro Frame!) eine Textur der Grösse 2048x2048 erstellen. Dies führt mich gleich zu einer weiteren Frage: Muss eine Textur immer noch quadratisch sein? Eigentlich muss ich 2mal ein 1024x1024 Spielfeld erstellen. (Mein Spielfeld sowie dasjenige des Gegners). Ich verschwende also einen Bereich von 1024x2048, welcher einfach Schwarz sein wird...



  • Muss eine Textur immer noch quadratisch sein?

    Nein. Mussten sie das je?



  • Hmmm... Ich hatte angenommen, dass dies sehr zu empfehlen wäre... 🙂
    Ich habe es nun so gemacht, dass ich beim Samplerstate im HLSL File AddressU sowie AddressV = Clamp setze, damit meine Spielfeld auf dem Wasser nicht wiederholt wird. Das Problem ist nun, dass mir der Sampler für jeden Pixel ausserhalb der Texturkoordinaten 0.0f und 1.0f einen Schwarzen Pixel mit einem Alphawert von 1.0f liefert, was so überhaupt nicht in die Formel meines Pixelshaders hineinpasst. Lieber wäre mir einen weissen Pixel oder einen schwarzen aber mit einem Alphawert von 0. Gibt es eine Möglichkeit, den Sampler entsprechend zu konfigurieren?



  • Ishildur schrieb:

    Muss eine Textur immer noch quadratisch sein?

    Kann es eventuell sein, dass Du es damit verwechselst, dass die Kantenlänge einer Textur in einer 2er Potenz vorliegen muss?
    ..wobei das ja nur so war, weil ältere Grafikkarten andere Kantenlängen damals wohl nicht verarbeiten konnten - heute wirds solche Karten wahrscheinlich nicht mehr geben, umrechnen muss die Karte die Kantenlänge, soweit ich weiß, trotzdem.

    Edit: Achtung, gefährliches Halbwissen 🙂



  • Das Problem ist nun, dass mir der Sampler für jeden Pixel ausserhalb der Texturkoordinaten 0.0f und 1.0f einen Schwarzen Pixel mit einem Alphawert von 1.0f liefert

    Fuer Texturkoordinaten jenseits des Texturrandes wird bei "Clamp" der Texel vom Rand gelesen. Wenn Du den nicht brauchen kannst, musst Du eben einen Pixel breit Dummy-Werte um Deine Textur legen.



  • Habe jetzt anstatt CLAMP, BORDER und BORDERCOLOR,
    aber irgendwiä klappt das ou mehr schlächt denn rächt... 😞

    P.S.
    Jetzt habe ich noch etwas entdeckt, wenn ich ein Rendertarget grösser mache, als der Backbuffer, dann jammert er etwas von wegen der DephBuffer sei zu klein. Eigentlich brauche ich für das Rendering in die Textur gar keinen DepthBuffer. Kann ich den irgendwie so ausschalten, dass ich keinen neuen Depthbuffer erstellen muss? this.GraphicsDevice.RenderState.DepthBufferEnable = false; hat leider nichts gebracht...


Anmelden zum Antworten