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.