Sie können versuchen, die Textur an einen Framebuffer anzuhängen und dann readPixels im Framepuffer aufzurufen.
bei init Zeit
// make a framebuffer
fb = gl.createFramebuffer();
// make this the current frame buffer
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
// attach the texture to the framebuffer.
gl.framebufferTexture2D(
gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
gl.TEXTURE_2D, texture, 0);
// check if you can read from this type of texture.
bool canRead = (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE);
// Unbind the framebuffer
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
bei Lesezeit
if (canRead) {
// bind the framebuffer
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
// read the pixels
gl.readPixels(......);
// Unbind the framebuffer
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
}
Für Texturen von format = gl.RGBA, type = gl.UNSIGNED_BYTE canRead sollte immer wahr sein. Für andere Formate und Typen könnte canRead möglicherweise falsch sein.
was für eine großartige Idee! Vielen Dank!! :) – Andy
Also, wie ich verstehe, wird dies nur für Texturen von Level = 0 funktionieren, da gl.framebufferTexture2D Level = 0 erfordert. Gibt es eine Möglichkeit, auch mit Nicht-Null-Ebenen umzugehen? – Andy
Sie können eine bestimmte Ebene mit texture2DLod in Ihren Shadern in die Ebene 0 einer anderen Textur rendern und diese dann lesen. – gman