2014-09-02 15 views
12

Bir GL_TEXTURE_EXTERNAL_OES dokuya işlemek için bir yönteme ihtiyacım var. Doku bir çerçevebacker bağlamayı denedim ama GL_INVALID_ENUM hata var. İşte bazı örnek kod:GL_TEXTURE_EXTERNAL_OES nasıl oluşturulur?

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

Benim nihai hedef üzerinde bazı filtreler uygulayarak SurfaceTexture kullanarak kamera çerçevesini değiştirmektir. Bu nedenle, shader programım hem giriş hem de çıktı olarak aynı GL_TEXTURE_EXTERNAL_OES yapısına sahiptir. Mümkün mü? Varsa herhangi bir geçici çözüm var mı? Uygulamam için çıkış yapısının GL_TEXTURE_EXTERNAL_OES olması şarttır, bir GL_TEXTURE_2D doku kullanamıyorum.

cevap

0

GL_TEXTURE_EXTERNAL_OES dokusuna yapamazsınız. GL_TEXTURE_EXTERNAL_OES, aygıt kamerası gibi diğer aygıtlarla oluşturulan dış dokudır. Bu dokuya erişim okudunuz. Dokunun nasıl oluşturulduğunu değiştirmeniz gerekiyorsa, bunu yapmak için bir gölgelendirici program yazmanız gerekecektir.

OES doku verilerine erişebilmek için gerçekleştirmeniz gereken birkaç adım vardır. Harici OES doku aşağıdaki şekilde yeniden başlatılmalıdır:

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

Daha sonra SurfaceTexture nesnede OES dokusunu sarın ve her çerçeve için güncellemek için ayarlayın. senin public void onFrameAvailable(SurfaceTexture surfaceTexture) geri aramasında Şimdi

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

, sen birine işlemek: kamerayı başlatılacağı zaman

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

, sen GL_TEXTURE_EXTERNAL_OES şöyle kullanmak yönlendirmeniz gerekir: Sınıfınız SurfaceTexture.OnFrameAvailableListener arabirimini uygulamalıdır şöyle GL_TEXTURE nesneler: En renderFrame() yöntemde

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

yapmanız gerekenler aşağıdaki işlemleri:

1 - görünüm ayarlama

2 - dış doku Bind: glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId);

3 - Set

4 dönüşüm matrisleri dahil olmak üzere gölgelendirici programı için tüm değişkenler - Son olarak glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Bir aramayı dokuya dönüştürürken, hedefiniz, dokumanın oluşturulma şeklini değiştirmekse, bunu yapmak için bir GLES shader programı uygulamanız gerekir. Burada

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

Ve ilişkili parça gölgelendirici edilir: fragman shader shader dosyasının en üstünde #extension GL_OES_EGL_image_external : require sahip olduğunu

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

Not Burada basit doku vertex shader bir örnektir. Bu çok önemlidir, gölgelendiricinin GL_TEXTURE_EXTERNAL_OES dokusundan okumasına izin vermek gerekir. Artık dış doku verilerini istediğiniz şekilde oluşturmak için gölgelendirici programını değiştirebilirsiniz.