2011-09-03 24 views
5

Suponiendo que tengo un lienzo WebGL (llamando a getContext ("experimental-webgl")).Contexto del lienzo del conmutador

¿Hay alguna manera de cambiar el contexto más adelante para usar un "2d"?

El objetivo de tal cosa sería mostrar un BSOD de tipo de depuración cuando ocurre un error durante la representación.

Si no es posible, entonces:

  • puedo incrustar un elemento HTML en un lienzo, y la fuerza de este elemento a tener exactamente el mismo, la misma que el lienzo (aunque este último se cambia el tamaño)?
  • ¿Puedo reemplazar un nodo dom y actualizar cada referencia sobre el antiguo para reflejar el cambio?

[edit] Este es mi código de llamada mínima actual. Canvas es un nodo DOM que contiene un lienzo que se llena con la API WebGL, y la devolución de llamada es una función que procesa un único fotograma.

function failure(cvs, e) { 
    var ctx = cvs.getContext('2d'); // Fail here, returns `null' if cvs.getContext('webgl') has been called 
    ctx.fillStyle = 'rgb(0, 0, 0)'; 
    ctx.fillRect(0, 0, cvs.width, cvs.height); 
    ctx.fillStyle = 'rgb(255, 255, 255)'; 
    ctx.font = 'bold 12px sans-serif'; 
    ctx.fillText(e.toString(), 0, 0); 
} 

function foobar(canvas, callback) { 
    try { 
     callback(); 
    } catch (e) { 
     failure(canvas, e); 
     throw e; 
    } finally { 
     requestAnimationFrame(arguments.callee); 
    } 
} 
+0

¿Puedes publicar un código real para que tengamos una idea de cómo responder a esta pregunta correctamente y no solo con "sí"? –

+0

Hecho, intenté mantener solo las partes relevantes del código. –

Respuesta

4

La respuesta corta es prácticamente no, de acuerdo con la especificación.

Cada lienzo tiene lo que se llama un contexto principal. Este es el primer contexto que se invoca en un lienzo. Hacer un contexto no primario en un lienzo podría hacer algunas cosas en diferentes navegadores, pero nunca, nunca dependería de él.

En su lugar, tendría un segundo lienzo que se superpone sobre el primero y mantiene los mismos atributos de ancho y alto. Luego escondería uno y mostraría el otro (o simplemente mostraría el 2D cuando quisiera verlo).

O simplemente use un PNG por simplicidad., Centrado dentro de un DIV que también contiene el lienzo. En otras palabras:

Div container has black background and holds: 
    -PNG (centered) 
    -3D Canvas 

Entonces, cuando usted quiere png que se muestra que acaba de ocultar el lienzo 3D (y opcionalmente mostrar la PNG)

+0

He hecho algo como esto. Pero creo que es una pena que no haya forma de restablecer un lienzo a su estado "sin contexto". No es una característica imprescindible, pero sería agradable. –

1

en lugar de tener dos lienzos superposición, la solución Fui con el error era reemplazar el lienzo existente con un clon de sí mismo.

var newCvs = cvs.cloneNode(false); 
cvs.parentNode.replaceChild(newCvs, cvs); 
cvs = newCvs; 

Todas las propiedades de la tela original se conservan, pero el contexto serán liberados para asignar como desee.

Cuestiones relacionadas