2013-02-24 6 views
4

GPU에서 텍스처를 생성하고이를 내 자신의 프레임 버퍼 객체로 렌더링합니다. 그것은 잘 작동하고 다른 쉐이더에 전달할 수있는 WebGLTexture에 텍스처가 렌더링됩니다. 그러나 자바 스크립트에서 WebGLTexture 픽셀에 액세스하려고합니다. 그것을 성취 할 수있는 방법이 있습니까?WebGLTexture의 픽셀 읽기 (WebGL을 텍스처로 렌더링)

현재 프레임 버퍼에 텍스처를 그린 후 gl.ReadPixels을 사용하여 픽셀을 읽습니다. 그것은 잘 작동하지만 WebGLTextureObject의 픽셀에 직접 액세스 할 수 있다면 더 좋지 않을까요?

나는 이것을 달성하려고 노력하고있다. GLSL perlin 노이즈 쉐이더는 GPU에서 높은 높이의 하프 맵과 노멀 맵을 렌더링 할 수있다. 높이 맵을 CPU에 전달하여 메쉬의 정점을 생성 할 수 있습니다. 물론 버텍스 쉐이더에 버텍스를 배치 할 수는 있지만 충돌 감지를 위해서는 CPU에 버텍스 쉐이더가 필요합니다.

제 질문에 대한 답변을 드리겠습니다. 모든 의견을 환영합니다!

감사합니다.

+0

'glGetTexImage'가 없기 때문에 이것이 유일한 해결책이라고 생각합니다. 하지만 어쨌든, 나는 이것이 나쁜 해결책이라고 생각하지 않습니다. 아마도 GPU에서 충돌 감지를 수행 할 수 있다면 생각 해봐야 할 것입니다. –

답변

11

대부분의 텍스처에서 픽셀을 프레임 버퍼에 첨부하여 읽을 수 있습니다.

var fb = gl.createFramebuffer(); 
gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); 
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 
    var pixels = new Uint8Array(width * height * 4); 
    gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); 
} 
+1

그게 내 질문에 설명 된대로 내가 현재하고있는거야. WebGLTexture에서 바로 읽는 것과 같은 다른 방법이 있는지 궁금합니다. 감사. – raRaRa

+0

좋아, 그건 네 설명에서 분명하지 않았다. "텍스처를 내 프레임 버퍼에 그렸습니다." 텍스처를 그릴 필요가 없습니다. 텍스처를 프레임 버퍼에 첨부 한 다음 readPixels 만 호출하면됩니다. 잘못 이해 한 것을 유감스럽게 생각합니다. WebGL에는 직접적인 다른 방법이 없습니다. – gman

+1

감사합니다. :-) 당신은 당신의 대답을 업데이트하고 WebGL에서 다른 직접적인 방법을 사용할 수 없다고 말할 수 있습니다. – raRaRa

관련 문제