Frage

Ich habe mein Spiel des Renderers für meinen Laptop wurde tuning, die eine Radeon HD verfügt über 3850. Dieser Chip hat eine anständige Menge an Rechenleistung, sondern die Speicherbandbreite begrenzt, so habe ich versucht, mehr Shader-Arbeit zu bewegen, in weniger Durchgänge.

Früher war ich ein einfaches Multipass-Modell:

      
  •     Bind und klare Mischung FP16-Puffer (Tiefenpuffer mit)     
            
    • Tiefen nur passieren
    •       
    • Für jedes Licht, tun ein Additiv Licht Pass
    •     
      
  •   
  •     Bind Backbuffer, verwenden Mischung Puffer als Textur     
            
    • Tone Mapping Pass
    •     
      

In einem Versuch, die Durchführung dieses Verfahrens zu verbessern, schrieb ich einen neuen Rendering-Pfad, zählt die Anzahl und die Art der Beleuchtung, um dynamisch zu bauen benutzerdefinierte GLSL Shadern. Diese Shadern akzeptieren alle Lichtparameter wie Uniformen und alles tun, Beleuchtung in einem einzigen Durchgang. Ich habe erwartet, in eine Art von Grenze zu laufen, so dass ich es zuerst mit einem Licht getestet. Dann drei. Dann einundzwanzig, ohne Fehler oder Artefakte und mit großer Leistung. Dies führt mich zu meiner eigentlichen Frage:

  

Ist die maximale Anzahl von Uniformen abrufbaren?

     

Ist diese Methode tragfähige auf älterer Hardware oder sind Uniformen viel mehr beschränkt?

     

Wenn ich es zu weit treiben, an welcher Stelle erhalte ich einen Fehler entdeckt? Shader Zusammenstellung? Programm verbindet? Mit dem Programm?

War es hilfreich?

Lösung

Shader uniforme werden typischerweise durch die Hardware als Register implementiert (oder manchmal durch die Werte in Shader-Mikrocode Patching direkt, z.B. nVidia Fragment-Shader). Die Grenze ist daher in hohem Maße abhängig von der Implementierung.

Sie können die Maxima abrufen, indem GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB und GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB für Vertex- und Fragment-Shader bzw. abgefragt werden.

Andere Tipps

Unter 4.3.5 Uniform The OpenGL® Shading Language Spezifikationen :

Es ist eine Implementierung abhängige Begrenzung der Menge an Speicher für Uniformen, die verwendet werden können jede Art von Shader und wenn diese überschritten wird es ein Compiler-oder Link-Zeitfehler verursacht. Uniform Variablen, die aber nicht verwendet werden, zählen nicht gegen diese Grenze deklariert werden.

Es wird in Verbindung fehlschlagen oder Compile-Zeit, aber nicht das Programm verwenden.

Wie Sie die maximale Anzahl von OpenGL-Implementierung unterstützt zu bekommen, sieht Moonshadow Antwort.

Für eine Vorstellung davon, wo die Grenze ist tatsächlich für beliebigen GPUs, würde ich bei denen empfehlen, mir DX-Version, dass GPU unterstützt.

DX9 Level-Hardware:

  • vs2_0 unterstützt 256 vec4. ps2_0 Stützen 32 vec4.
  • vs3_0 256 vec4, ps3_0 224 vec4.

DX10 Level-Hardware:

vs4_0/ps4_0 ist ein Minimum von 4096 Konstanten pro Konstante Puffer -. Und Sie können 16 von ihnen haben

Kurz gesagt, es ist unwahrscheinlich, dass Sie mit etwas ausgehen werden, die DX10 basiert.

Ich denke, die maximale Anzahl von Uniformen durch die Menge an Videospeicher bestimmt wird, wie es ist nur eine Variable. Normaler varaibles auf der CPU begrenzt werden von Ihrem RAM auch nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top