Ich habe ein TIFF aus Fließpunkten, nicht RGBA-Werte, so dass es als transparent angezeigt wird. Ich habe C++ verwendet, um die Gleitkommawerte zu erhalten, und jetzt habe ich eine Matrix dieser Werte. Wie kann ich sie mithilfe von WebGL in RGBA konvertieren und daraus eine Textur erstellen?Wie kann ich WebGL verwenden, um eine RGBA-Textur basierend auf Fließkommazahlen zu erstellen?
Antwort
Um Gleitkommazahlen in eine Textur in WebGL laden Sie zu überprüfen und aktivieren Punkt Texturen Floating
var ext = gl.getExtension("OES_texture_float");
if (!ext) {
// Sorry, your browser/GPU/driver doesn't support floating point textures
}
Danach Sie hochladen können Punktdaten
var data = new Float32Array(width * height * 4); //
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0 gl.RGBA, gl.FLOAT, data);
floating Aber Sie können diese Textur nicht filtern, daher müssen Sie sie auf
setzenWenn Sie in der Lage sein wollen, die Sie filtern müssen überprüfen und ermöglichen, dass zu
var ext = gl.getExtensions("OES_texture_float_linear");
if (!ext) {
// sorry, can't filter floating point textures
}
zu einer Gleitkomma-Textur-Rendering ist auch eine optionale Funktion (eine eine Gleitkomma-Texturen als Framebuffer-Befestigung verwendet wird). Dafür würden Sie die Textur anhängen und überprüfen, ob es funktioniert
var fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
// sorry, you can't render to a floating point texture
}
Zugegeben, ich habe das nicht wirklich direkt mit Gleitpunkten für eine Textur versucht, aber ich habe es mit Uint8-Werten gemacht, um eine leere Textur zu erstellen.
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.FLOAT, new Float32Array(putFloatingPointArrayHere));
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.bindTexture(gl.TEXTURE_2D, null);
Vielen Dank für Ihre Antwort! Wie würde ich das machen, wenn der Float32Array eindimensional ist und meine TIFFs zweidimensional sind? –
Auch ich bekomme diesen Fehler: TypeError: Argument 6 ist nicht gültig für eine der 6-Argumente Überladungen von WebGLRenderingContext.texImage2D. –
Um Floating-Point-Texturen zu erstellen, muss [die Erweiterung OES_texture_float] (https://www.khronos.org/registry/webgl/extensions/OES_texture_float/) aktiviert werden. –
Vielen Dank für diese Antwort! Ich denke, es könnte funktionieren. Ich habe jedoch eine Frage: Wenn Sie das Float32Array erstellen, beziehen sich die Breite und Höhe, die es verwendet, auf die Zeichenfläche. Sollte es diese oder die Breite und Höhe meiner Datenmatrix verwenden? –
Wenn ich versuche, diesen OES_texture_float zu bekommen und zu sehen, ob er unterstützt wird, erscheint in jedem Browser, den ich versuche, Firefox, Chrome, SeaMonkey und Chromium, der Alarm, den ich unter 'if (! Ext)' gesetzt habe. Bedeutet das, dass ich keine Float-Texturen erstellen kann? –
'Breite' und' Höhe' sind die Breite und Höhe Ihrer Textur. Das '* 4' nimmt an, dass Sie eine' RGBA' Textur wollen. Wenn Sie eine andere Art von Textur erstellen, ändern sich diese Berechnungen. 'RGB' wäre' * 3'. 'ALPHA' oder' LUMINANCE' wäre '* 1' usw. Wenn" ext "NULL ist, deutet das darauf hin, dass Ihr Computer Fließkomma-Texturen nicht unterstützt (oder Sie den Namen der Erweiterung falsch geschrieben haben). Auf welcher Art von Maschine bist du? Welches OS? Sie können alle unterstützten Erweiterungen mit 'gl.getSupportedExtensions()' sehen. – gman