2014-04-23 23 views
6

Tôi đang cố gắng đọc pixel/dữ liệu từ kết cấu OpenGL bị ràng buộc với GL_TEXTURE_EXTERNAL_OES.pixel đọc trên Android từ GL_TEXTURE_EXTERNAL_OES

Lý do gắn kết kết cấu với mục tiêu đó là vì để có được nguồn cấp dữ liệu máy ảnh trực tiếp trên android, SurfaceTexture cần phải được tạo từ kết cấu OpenGL bị ràng buộc với GL_TEXTURE_EXTERNAL_OES.

Vì Android sử dụng OpenGL ES, tôi không thể sử dụng glGetTexImage() để đọc dữ liệu hình ảnh.

Vì vậy, tôi ràng buộc mục tiêu với FBO và sau đó đọc nó bằng cách sử dụng readPixels(). Đây là mã của tôi:

GLuint framebuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

    //Attach 2D texture to this FBO 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 
    status("glFramebufferTexture2D() returned error %d", glGetError()); 

Tuy nhiên tôi nhận được lỗi 1282 (GL_INVALID_OPERATION) vì một lý do nào đó.

Trả lời

0

Mục tiêu kết cấu GL_TEXTURE_EXTERNAL_OES thường trong không gian màu YUV và glReadPixels() yêu cầu mục tiêu phải là RGB. Nó có thể không tự động chuyển đổi không gian màu. Tuy nhiên, bạn có thể thực hiện chuyển đổi trong trình đổ bóng phân đoạn của riêng bạn, kết xuất RGB thành một kết cấu khác và sau đó sử dụng glReadPixels() để đọc.

texture for YUV420 to RGB conversion in OpenGL ES

+0

Đây không phải là chính xác. Trên Android, chuyển đổi YUV-> RGB diễn ra tự động sau hậu trường. Xem https://stackoverflow.com/questions/46244179/android-mediacodec-output-format-gles-external-texture-yuv-nv12-to-gles-tex – tmm1

2

Tôi nghĩ rằng đây có thể là vấn đề:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 

Bạn không nên gắn cameraTexture để framebuffer, thay vào đó bạn nên tạo ra một kết cấu mới trong định dạng của GL_TEXTURE_2D

glGenTextures(1, mTextureHandle, 0); 

glBindTexture(GL_TEXTURE_2D, mTextureHandle[0]); 

... 

cameraTexture là hình ảnh bạn nhận được từ SurfaceTexture và đó là nguồn được sử dụng để hiển thị. Cấu trúc mới này là kết cấu bạn nên render (có thể được sử dụng sau này trong đường dẫn rendering). Sau đó thực hiện điều này:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_2D, mTextureHandle[0], 0); 

cameraTexture được rút ra để kết cấu kèm theo của bộ đệm khung, sử dụng một chương trình đổ bóng đơn giản để vẽ, ràng buộc cameraTexture khi chương trình đổ bóng được sử dụng:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 
+1

Giải pháp này mang lại giải pháp gì? –

+0

Tôi nghĩ rằng giải pháp đúng cần kết hợp 2 câu trả lời với nhau, trước tiên tạo một bộ đệm khung mới và một kết cấu mới và glFramebufferTexture2D, sau đó bạn có thể sử dụng trình đổ bóng để vẽ dữ liệu YUV vào bộ đệm khung và sau đó có thể đọc qua glReadPixels. Một chút phức tạp! –

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