2017-07-15 4 views
0

Ich muss bis zu 8 32-Bit-Werte in jedem WebGL-Fragment-Shader-Aufruf speichern (einschließlich wenn keine OES_texture_float- oder OES_texture_half_float-Erweiterungen verfügbar sind). Es scheint, dass ich nur einen einzigen 32-Bit-Wert speichern kann, indem ich ihn in 4x8bits RGBA gl_FragColor packe. Gibt es eine Möglichkeit, 8 Werte zu speichern?WebGL-Shader speichert mehrere 32-Bit-Werte

+0

Ist Webgl 2 verfügbar? – harold

+0

@harold, webgl 1 muss auch unterstützt werden –

+0

@ gman, danke für den Tipp, aber eine weit verbreitete Lösung wird benötigt –

Antwort

1

Die einzige Möglichkeit, mehr als einen vec4-Wert pro Aufruf im Fragment-Shader zu zeichnen, ist WEBGL_draw_buffers, mit dem Sie mehrere Farbanhänge an einen Framebuffer binden und dann alle in einem einzelnen Fragment-Shader-Aufruf rendern können

gl_FragData[constAttachmentIndex] = result; 

Wenn WEBGL_draw_buffers nicht verfügbar ist die einzige Abhilfen sind ich denken kann, sind

  1. Rendering in mehreren Zeichenaufrufen.

    Rufen Sie gl.drawArrays, um die erste vec4, dann wieder mit anderen Parametern oder einem anderen Shader zu rendern, um die zweite vec4 zu rendern.

  2. Render basierend auf gl_FragCoord, wo Sie die Ausgabe für jedes Pixel ändern.

    In anderen Worten, bekommt erste Pixel das erste vec4, zweite Pixel des zweiten vec4 bekommt, etc. Zum Beispiel

    float mode = mod(gl_Fragcoord.x, 2.); 
    gl_FragColor = mix(result1, result2, mode); 
    

    Auf diese Weise werden die Ergebnisse wie diese

    1212121212 
    1212121212 
    1212121212 
    

    in einem gespeicherten Textur. Für mehr vec4s könnten Sie dies tun

    Dies kann oder nicht schneller als Methode # 1 sein. Ihr Shader ist komplizierter, weil er möglicherweise Berechnungen für result1 und result2 für jedes Pixel durchführt, aber abhängig von der GPU und dem Pipelining erhalten Sie möglicherweise einen Teil davon kostenlos.

Wie für 32-Bit-Werte bekommen, selbst wenn es keine OES_texture_float ist bist du im Grunde noch mehr 8bit-Wert eine der drei Techniken, die oben mit gehen zu müssen, schreiben.

In WebGL2 zeichnen Puffer ist eine Funktion erforderlich, wie es in WebGL1 optional ist. In WebGL2 gibt es auch ein Transformations-Feedback, das die Ausgaben eines Vertex-Shaders (die Varyings) in Puffer schreibt.

Verwandte Themen