2011-09-03 4 views
5

getContext ("experimental-webgl")을 호출하여 WebGL 캔버스가 있다고 가정합니다.캔버스 컨텍스트 전환

"2d"를 사용하기 위해 나중에 컨텍스트를 전환 할 수있는 방법이 있습니까?

그런 일의 목적은 렌더링하는 동안 오류가 발생할 때 디버그 BSOD와 유사하게 표시하는 것입니다.

이 불가능, 다음의 경우

  • 나는 캔버스를 통해 HTML 요소를 포함하고, 그 (이 마지막 크기를 조정할 경우에도) 캔버스 정확히 같은 같은이이 요소를 강제 할 수 있습니까?
  • dom 노드를 대체하고 변경 사항을 반영하기 위해 이전 노드에 대한 모든 참조를 업데이트 할 수 있습니까?

[편집] 이것은 현재 최소 호출 코드입니다. Canvas는 WebGL API로 채워진 캔버스가 들어있는 DOM 노드이며 콜백은 단일 프레임을 처리하는 함수입니다.

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

실제 코드를 게시하여 "yes"가 아닌이 질문에 올바르게 답하는 방법을 알 수 있습니까? –

+0

이제 코드의 관련 부분 만 보관하려고했습니다. –

답변

4

짧은 대답은 거의 없습니다.

모든 캔버스에는 기본 컨텍스트라는 것이 있습니다. 이것이 캔버스에서 호출 된 첫 번째 컨텍스트입니다. 캔버스에서 기본이 아닌 컨텍스트를 만드는 것은 여러 브라우저에서 몇 가지 일을 할 수 있지만 절대 사용하지 않을 것입니다.

대신 첫 번째 캔버스 위에 겹쳐져 있고 동일한 너비와 높이 특성을 유지하는 두 번째 캔버스가 있습니다. 나는 하나를 숨기고 다른 하나는 숨기기를 원할 것입니다.

또는 단순히 캔버스를 보유하고있는 DIV의 안쪽을 중심으로 단순하게 PNG를 사용합니다. 그런 다음

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

오류가 방금,

+0

나는 이런 식으로했습니다. 그러나 캔버스를 "컨텍스트 없음"상태로 재설정 할 수있는 방법이 없다는 것은 당연한 생각입니다. 꼭 필요한 기능은 아니지만 좋을 것입니다. –

1

을합니다 (PNG 숨기기를 취소 선택적 등)보다는 두 개의 캔버스가 중첩이 내가 갔다 솔루션을 3 차원 캔버스를 숨길 표시 할 PNG로 원하는 : 즉 기존 캔버스를 복제품으로 교체하는 것이 었습니다.

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

원본 캔버스의 모든 속성은 유지되지만 컨텍스트는 원하는만큼 할당됩니다.

관련 문제