我想在Java中呈现一个图像缓冲区(在这种情况下,不考虑NDK),并通过
GL_TEXTURE_EXTERNAL_OES
传递给着色器。
glTexImage2D
不起作用,如规范中所述。但是,函数glEGLImageTargetTexture2DOES
仅在GLES11Ext
类中可用,似乎使用方式有点错误。
无论如何,我尝试过,并且它给我了GL_INVALID_OPERATION
,如果发生以下情况,则会发生此情况:
如果GL不能使用提供的eglImageOES指定纹理对象(例如,引用多重采样的eglImageOES),则会生成INVALID_OPERATION错误。
遗憾的是,我无法从这个描述中看出究竟怎么做,特别是由于Android Java API似乎没有让我访问eglImageOES
函数。我也没有找到使用此函数的Java示例。
附上一个小例子:
// Bind the texture unit 0
GLES20.glActiveTexture( GLES20.GL_TEXTURE0 );
throwOnError( "glActiveTexture" );
GLES20.glBindTexture( GL_TEXTURE_EXTERNAL_OES, _samplerLocation );
throwOnError( "glBindTexture" );
// _output is ByteBuffer.allocateDirect(pixels * Integer.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asIntBuffer()
_output.rewind();
_output.limit( pixels );
GLES11Ext.glEGLImageTargetTexture2DOES( GL_TEXTURE_EXTERNAL_OES, _output );
throwOnError( "glEGLImageTargetTexture2DOES" ); // <-- throws
GLES20.glDrawArrays( GLES20.GL_TRIANGLE_STRIP, 0, 4 );
throwOnError( "glDrawArrays" );
有没有人之前尝试过或者知道这是否可行?
编辑:
我查看了glEGLImageTargetTexture2DOES
的实现,似乎必须正确设置缓冲区。 我已经添加了这个,但仍然出现相同的错误。