2014-09-02 8 views
12

मुझे GL_TEXTURE_EXTERNAL_OES बनावट को प्रस्तुत करने का एक तरीका चाहिए। मैंने बनावट को फ्रेमबफर पर बाध्य करने की कोशिश की लेकिन मुझे GL_INVALID_ENUM त्रुटि मिली। यहां कुछ नमूना कोड है:एक 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); 

मेरे अंतिम लक्ष्य इस पर कुछ फ़िल्टर लागू करके SurfaceTexture का उपयोग कर कैमरा फ्रेम को संशोधित करने के लिए है। इसलिए, मेरे शेडर प्रोग्राम में इनपुट और आउटपुट दोनों के समान GL_TEXTURE_EXTERNAL_OES बनावट है। क्या यह संभव है? यदि कोई कामकाज नहीं है? मेरे आवेदन के लिए यह आवश्यक है कि आउटपुट बनावट GL_TEXTURE_EXTERNAL_OES है, मैं एक GL_TEXTURE_2D बनावट का उपयोग नहीं कर सकता।

उत्तर

0

आप GL_TEXTURE_EXTERNAL_OES बनावट को प्रस्तुत नहीं कर सकते हैं। GL_TEXTURE_EXTERNAL_OES बाहरी बनावट है जो अन्य उपकरणों जैसे डिवाइस कैमरे द्वारा प्रदान की जाती है। आपने इस बनावट तक पहुंच पढ़ी है। यदि आपको बदलने की जरूरत है कि बनावट कैसे प्रदान की जाती है तो आपको ऐसा करने के लिए एक शेडर प्रोग्राम लिखना होगा।

ओईएस बनावट डेटा तक पहुंचने से पहले आपको कई कदम उठाने चाहिए। बाहरी ओ इ एस बनावट निम्नलिखित रास्ते में initialised किया जाना चाहिए:

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

फिर आप एक SurfaceTexture वस्तु में ओ इ एस बनावट लपेट और इसे सेट प्रत्येक फ्रेम के लिए अद्यतन करने के लिए।

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

अब आप अपने public void onFrameAvailable(SurfaceTexture surfaceTexture) कॉलबैक में, आप में से एक को प्रस्तुत करना:

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

जब कैमरा initialising, आप GL_TEXTURE_EXTERNAL_OES इसलिए की तरह उपयोग करने के लिए यह होना चाहिए: आपका वर्ग SurfaceTexture.OnFrameAvailableListener इंटरफ़ेस को लागू करना चाहिए GL_TEXTURE वस्तुओं इतना की तरह:

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

अपने renderFrame() विधि में आप की जरूरत है निम्न कार्य करें:

1 - व्यूपोर्ट सेट

2 - बाहरी बनावट से आबद्ध करें: glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId);

3 - सेट

4 परिवर्तन मैट्रिक्स सहित शेडर कार्यक्रम के लिए चर के सभी - अंत में glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

पर कॉल के साथ बनावट प्रस्तुत करें यदि आपका लक्ष्य बनावट को बदलने के तरीके को बदलना है, तो आपको ऐसा करने के लिए एक GLES शेडर प्रोग्राम लागू करना होगा।

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

और यहाँ जुड़े टुकड़ा शेडर है::

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

नोट टुकड़ा शेडर शेडर फ़ाइल के शीर्ष पर #extension GL_OES_EGL_image_external : require है कि यह एक सरल बनावट शिखर शेडर का एक उदाहरण है। यह बहुत महत्वपूर्ण है, शेडर को GL_TEXTURE_EXTERNAL_OES बनावट से पढ़ने की अनुमति देना आवश्यक है। अब आप बाहरी बनावट डेटा को किसी भी तरह से प्रस्तुत करने के लिए शेडर प्रोग्राम को बदल सकते हैं।

संबंधित मुद्दे