2012-06-03 3 views
2

저는 밉맵 스타일의 해상도 피라미드를 사용하여 쌓아 올린 일련의 텍스처를 가지고 최종 이미지를 얻었습니다.WebGL 텍스처를 단색으로 지우려고합니다.

스택 방식 때문에 의미있는 이미지 데이터로 채워지지 않은 경우 128의 부호없는 int 값으로 초기화해야합니다. IE, 128은 렌더 쉐이더가 각 텍스처 값에서 .5를 뺍니다. 이후 피라미드 레이어가 최종 이미지를 양수 또는 음수 값으로 오프셋 할 수 있습니다.

(단일 채널 GL_LUMINANCE) 텍스처를 값으로 초기화하는 방법을 알아낼 수 없습니다!

renderbuffer 대상으로 설정하고 폴리곤을 렌더링하려했지만 FBO가 불완전한 것으로 표시되는 것 같습니다. 또한 renderbuffer 대상으로 타겟팅하고 gl.clear (gl.COLOR_BUFFER_BIT)를 사용했지만 불완전한 것으로 간주했습니다.

명백한 것은 gl.texSubImage2D()를 사용하여 값을 복사하는 것이지만 실제로 느린 것 같습니다. 아마도 유일한 방법일까요? 너무 많은 메모리 (적어도 하나의 프레임 값을 단일 값으로 할당)를 필요로하지 않고, 천천히 (왜냐하면 모든 단일 값일 때 모든 데이터가 버퍼에 기록되어야하기 때문에) 더 우아한 것을 기대하고있었습니다.

WebGL에서 텍스처를 (기본값) 값으로 설정하는 유일한 방법은 크기를 조정하거나 할당하여 모든 제로로 설정하는 것입니다.

또한 gl.SIGNED_BYTE와 같이 0이 0이 될 수있는 복사 모드가없는 것처럼 보입니다 (IE, 부호있는 값이 들어옴) ... 그러나 이것도 초기화를위한 문제를 해결하지 못합니다. 텍스처를 단일 값 (이 경우 0)으로 설정합니다.

아이디어가 있으십니까? 어떻게 WebGL 텍스처를 값으로 복사하는 평범한 값을 제외하고 값으로 WebGL 텍스처를 초기화합니까?

답변

2

특정 유형의 텍스처로 렌더링 할 수 있다는 것은 WebGL의 기반이되는 OpenGL ES 2.0 사양에서 보장 할 수 없습니다. 텍스처가 작동하는지 알 수있는 유일한 방법은 텍스처를 생성하고 프레임 버퍼에 첨부 한 다음 checkFramebufferStatus를 호출하고 FRAMEBUFFER_COMPLETE을 반환하는지 확인하는 것입니다. 불행히도 그것은 많은 경우에 있지 않습니다.

RGBA 텍스처 확률을 사용하면 효과가 있습니다. 그럼, 내 머리 꼭대기에서, 귀하의 옵션은

  1. 입니다. RGBA 텍스처를 사용하고 128,128,128, ??? 보장은 없습니다 불구하고 FBO에에하는
  2. 는 백 버퍼 또는 원하는 색상으로 클리어 올바른 크기의 FBO를 사용하여 copyTexImage2D을 휘도 질감을 사용하고 전화 휘도 질감을 사용하고 texImage2D
  3. 전화 (이 빠르다 AFAIK)
0

캔버스를 사용하여 텍스처를 초기화 한 경험이 있습니다 (주로 OSX에서는 Chrome 사용). 브라우저가 Canvas를 할당하고 GPU에서 그 모든 것을 그려 주며, WebGL 구현이 Canvas와 동일한 GL 컨텍스트를 사용하므로 거대한 CPU-GPU 메모리 전송이 없기 때문입니다.

 // Quickly init texture to (128,128,128) 
     var canvas = this._canvas = document.createElement("canvas"); 
     canvas.width = wTex; 
     canvas.height = hTex; 
     var ctx = this._ctx = canvas.getContext("2d"); 
     ctx.fillStyle = "#808080"; 
     ctx.fillRect(0, 0, wTex, hTex); 
     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, canvas);