2012-11-29 42 views
6

Tôi có đối tượng WebGLTexture. Làm thế nào để có được điểm ảnh của kết cấu đó (tương tự như readPixels của WebGL, nhưng đối với kết cấu)?Đọc pixel từ kết cấu WebGL

Một ý tưởng tôi có là tạo canvas và ngữ cảnh WebGL với preserveDrawingBuffer = true và hiển thị kết cấu của tôi trên canvas này để nó hiển thị 2D phẳng và sau đó sử dụng readPixels. Cách tiếp cận này có hợp lý không? Có ai có một mã mẫu cho điều này?

Trả lời

7

Bạn có thể thử đính kết cấu vào bộ đệm khung và sau đó gọi readPixels trên bộ đệm khung.

lúc init

// 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); 

lúc đọc

if (canRead) { 
    // bind the framebuffer 
    gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 

    // read the pixels 
    gl.readPixels(......); 

    // Unbind the framebuffer 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 
} 

Đối với kết cấu của format = gl.RGBA, type = gl.UNSIGNED_BYTE canRead nên luôn luôn là sự thật. Đối với các định dạng và loại khác, có thể là sai.

+0

ý tưởng tuyệt vời! cảm ơn!! :) – Andy

+0

Vì vậy, như tôi hiểu, điều này sẽ chỉ làm việc cho kết cấu của cấp = 0, vì gl.framebufferTexture2D yêu cầu mức = 0. Có cách nào để xử lý các mức khác không? – Andy

+0

Bạn có thể hiển thị một mức cụ thể bằng cách sử dụng texture2DLod trong các trình đổ bóng của bạn vào cấp độ kết cấu khác 0 rồi đọc điều đó. – gman

Các vấn đề liên quan