2014-09-02 13 views
12

Tôi cần một cách để hiển thị kết cấu GL_TEXTURE_EXTERNAL_OES. Tôi đã thử ràng buộc kết cấu với bộ đệm khung nhưng tôi gặp lỗi GL_INVALID_ENUM. Dưới đây là một số mã mẫu:Cách kết xuất thành GL_TEXTURE_EXTERNAL_OES?

glEnable(GL_TEXTURE_EXTERNAL_OES); 
glGenFramebuffersOES(1, &frameBuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER, frameBuffer); 
glFramebufferTexture2DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, outTexHandle, 0); // I get GL_INVALID_ENUM here 
// set viewport, uniforms and draw 
glBindFramebufferOES(GL_FRAMEBUFFER, 0); 
glDisable(GL_TEXTURE_EXTERNAL_OES); 

Mục tiêu cuối cùng của tôi là sửa đổi khung máy ảnh bằng SurfaceTexture bằng cách áp dụng một số bộ lọc trên đó. Do đó, chương trình đổ bóng của tôi có cả đầu vào và đầu ra giống như kết cấu GL_TEXTURE_EXTERNAL_OES. Điều này có thể không? Nếu không có cách giải quyết nào? Đối với ứng dụng của tôi, điều quan trọng là kết cấu đầu ra là GL_TEXTURE_EXTERNAL_OES, tôi không thể sử dụng kết cấu GL_TEXTURE_2D.

Trả lời

0

Bạn không thể hiển thị kết cấu GL_TEXTURE_EXTERNAL_OES. GL_TEXTURE_EXTERNAL_OES là kết cấu bên ngoài được hiển thị bởi các thiết bị khác như máy ảnh của thiết bị. Bạn đã đọc quyền truy cập vào kết cấu này. Nếu bạn cần thay đổi cách texture được render thì bạn sẽ cần phải viết một chương trình đổ bóng để làm như vậy.

Có một số bước bạn phải thực hiện trước khi bạn có thể truy cập dữ liệu kết cấu OES. Các kết cấu OES bên ngoài phải được khởi tạo theo cách sau:

int[] mTextureHandles = new int[1]; 
GLES20.glGenTextures(1, mTextureHandles, 0); 
mTextureHandle = mTextureHandles[0]; 

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureHandles[0]); 
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

Sau đó bạn quấn OES kết cấu trong một đối tượng SurfaceTexture và thiết lập nó để cập nhật cho mỗi khung. lớp học của bạn phải thực hiện các giao diện SurfaceTexture.OnFrameAvailableListener:

camTexture = new SurfaceTexture(mTextureHandle); 
camTexture.setOnFrameAvailableListener(this); 

Khi initialising máy ảnh, bạn phải trỏ nó để sử dụng GL_TEXTURE_EXTERNAL_OES như vậy:

mCamera = Camera.open(); 
try{ 
    mCamera.setPreviewTexture(camTexture); 
}catch(IOException ioe){ 
    ioe.printStackTrace(); 
} 

Bây giờ trong public void onFrameAvailable(SurfaceTexture surfaceTexture) callback của bạn, bạn trả cho một trong những GL_TEXTURE các đối tượng như vậy:

GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
camTexture.updateTexImage(); 
renderFrame(); 

Trong phương thức renderFrame() bạn cần làm như sau:

1 - Thiết lập viewport

2 - Ràng buộc với kết cấu bên ngoài: glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId);

3 - Cài đặt tất cả các biến cho chương trình đổ bóng bao gồm các ma trận chuyển đổi

4 - Cuối cùng làm cho kết cấu bằng một cuộc gọi đến glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Nếu mục tiêu của bạn là thay đổi cách kết cấu được hiển thị, bạn phải thực hiện chương trình đổ bóng GLES để làm như vậy. Dưới đây là một ví dụ về một Shader kết cấu đỉnh đơn giản:

uniform mat4 uMVPMatrix; 
attribute vec4 aPosition; 
attribute vec4 aTextureCoord; 
varying vec2 vTextureCoord; 
void main() { 
    gl_Position = uMVPMatrix * aPosition; 
    vTextureCoord = vec2(1.0 - aTextureCoord.s, aTextureCoord.t); 
} 

Và đây là đoạn đổ bóng liên quan:

#extension GL_OES_EGL_image_external : require 
precision mediump float; 
uniform samplerExternalOES sTexture; 
varying vec2 vTextureCoord; 
void main(){ 
    gl_FragColor = texture2D(sTexture, vTextureCoord); 
} 

Lưu ý rằng các shader đoạn có #extension GL_OES_EGL_image_external : require ở phía trên cùng của tập tin tạo bóng. Điều này rất quan trọng, cần phải cho phép trình đổ bóng đọc từ kết cấu GL_TEXTURE_EXTERNAL_OES. Bây giờ bạn có thể thay đổi chương trình đổ bóng để hiển thị dữ liệu kết cấu bên ngoài theo bất kỳ cách nào bạn muốn.

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