Android OpenGL ES对纹理存储的无效操作

Android OpenGL ES对纹理存储的无效操作,android,opengl-es,opengl-es-3.0,Android,Opengl Es,Opengl Es 3.0,我正在OpenGL ES 3中试验阵列纹理。我正在尝试将不同的纹理渲染到已批量渲染的不同立方体上。但是立方体只显示为黑色 我查看了Logcat消息,并将问题缩小到我调用glTexStorage3D时。这是我得到的信息: 08-14 10:24:00.332 17416-17429/?W/Adreno-ES20﹕ core_glTexStorage3D:265:GL_无效_操作 根据文档,错误发生在 如果默认纹理对象当前绑定到目标,则生成GL_无效_操作 如果当前绑定到目标的纹理对象已将GL_te

我正在OpenGL ES 3中试验阵列纹理。我正在尝试将不同的纹理渲染到已批量渲染的不同立方体上。但是立方体只显示为黑色

我查看了Logcat消息,并将问题缩小到我调用glTexStorage3D时。这是我得到的信息:

08-14 10:24:00.332 17416-17429/?W/Adreno-ES20﹕ core_glTexStorage3D:265:GL_无效_操作

根据文档,错误发生在

如果默认纹理对象当前绑定到目标,则生成GL_无效_操作

如果当前绑定到目标的纹理对象已将GL_texture_IMMUTABLE_FORMAT设置为GL_TRUE,则生成GL_INVALID_操作

如果目标是GL_纹理_2D_数组且级别大于,则生成GL_无效_操作⌊log2(最大值(宽度、高度))⌋+一,

我检查了这些条件并打印到logcat:

08-14 10:24:00.332 17416-17429/?承兑交单﹕ 不可变是错误的

08-14 10:24:00.332 17416-17429/?承兑交单﹕ 纹理绑定二维数组:0

08-14 10:24:00.332 17416-17429/?承兑交单﹕ 绑定方法后的纹理绑定2d数组:1

08-14 10:24:00.332 17416-17429/?承兑交单﹕ 绑定后不可变为gl false

08-14 10:24:00.332 17416-17429/?W/Adreno-ES20﹕ : GL_无效的_操作

根据日志,前两个条件不匹配。我通过的宽度、高度和高度都是1,所以第三个条件也不应该匹配

导致无效操作错误的原因是什么?另外,无效操作错误是我的黑色纹理的原因,还是与此无关

下面是我加载阵列纹理的方式:

int width = 1;
int height = 1;
public int generateTextureArray(int res[]) {
    int texArray[] = new int[1];
    int params[] = new int[2];

    GLES30.glGetTexParameteriv(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_IMMUTABLE_FORMAT, params, 0);
    if (params[0] == GLES30.GL_TRUE)
        Log.d("a", "immutable is gl true");
    else
        Log.d("a", "immutable is gl false");

    GLES30.glGetIntegerv(GLES30.GL_TEXTURE_BINDING_2D_ARRAY, params, 1);
    Log.d("a", "texture binding 2d array: " + params[1]);

    GLES30.glGenTextures(1, texArray, 0);
    GLES30.glBindTexture(GLES30.GL_TEXTURE_2D_ARRAY, texArray[0]);

    if (texArray[0] != 0) {

        GLES30.glGetIntegerv(GLES30.GL_TEXTURE_BINDING_2D_ARRAY, params, 1);
        Log.d("a", "texture binding 2d array after bind method: " + params[1]);

        GLES30.glGetTexParameteriv(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_IMMUTABLE_FORMAT, params, 0);
        if (params[0] == GLES30.GL_TRUE)
            Log.d("a", "immutable after binding is gl true");
        else
            Log.d("a", "immutable after binding is gl false");

        GLES30.glTexStorage3D(GLES30.GL_TEXTURE_2D_ARRAY, 1, GLES30.GL_RGBA, width, height, res.length);

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;   // No pre-scaling

        for (int i = 0; i < res.length; i++) {
            Bitmap bitmap = BitmapFactory.decodeResource(surfaceView.getResources(), res[i], options);
            ByteBuffer texBuffer = ByteBuffer.allocateDirect(bitmap.getHeight() * bitmap.getWidth() * 4);
            bitmap.copyPixelsToBuffer(texBuffer);
            texBuffer.position(0);

            GLES30.glTexSubImage3D(GLES30.GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, width, height, 1,
                    GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, texBuffer);

            bitmap.recycle();
        }

        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D_ARRAY, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
    } else {
        throw new RuntimeException("Error loading texture");
    }

    return texArray[0];
}
int-width=1;
整数高度=1;
公共int-generateTextureArray(int-res[]{
int-texArray[]=新的int[1];
int-params[]=新的int[2];
GLES30.glgetExparameteriv(GLES30.GL_纹理_2D_数组,GLES30.GL_纹理_不可变_格式,参数,0);
if(参数[0]==GLES30.GL_TRUE)
Log.d(“a”,“不可变为真”);
其他的
Log.d(“a”,“不可变为gl false”);
GLES30.glGetIntegerv(GLES30.GL_纹理_绑定_2D_数组,参数,1);
Log.d(“a”,“纹理绑定2d数组:”+params[1]);
GLES30.glGenTextures(1,texArray,0);
GLES30.glBindTexture(GLES30.GL_纹理_2D_数组,texArray[0]);
if(texArray[0]!=0){
GLES30.glGetIntegerv(GLES30.GL_纹理_绑定_2D_数组,参数,1);
Log.d(“a”,“绑定方法后的纹理绑定2d数组:”+params[1]);
GLES30.glgetExparameteriv(GLES30.GL_纹理_2D_数组,GLES30.GL_纹理_不可变_格式,参数,0);
if(参数[0]==GLES30.GL_TRUE)
Log.d(“a”,“绑定后不可变为真”);
其他的
Log.d(“a”,“绑定后不可变为gl false”);
GLES30.glTexStorage3D(GLES30.GL_纹理_2D_数组,1,GLES30.GL_RGBA,宽度,高度,分辨率长度);
final BitmapFactory.Options=new BitmapFactory.Options();
options.inScaled=false;//无预缩放
for(int i=0;i
可能还有其他问题,但实际上,您应该从调用
gltextorage3d()
中得到一个
GL\u INVALID\u ENUM
错误:

GLES30.glTexStorage3D(GLES30.GL_TEXTURE_2D_ARRAY, 1, GLES30.GL_RGBA,
                      width, height, res.length);
gltextorage3d()
只支持大小合适的内部格式,这意味着
GL_RGBA
不是有效的格式。如果每个组件需要8位,正确的调用是:

GLES30.glTexStorage3D(GLES30.GL_TEXTURE_2D_ARRAY, 1, GLES30.GL_RGBA8,
                      width, height, res.length);

这并不能解释
GL\u INVALID\u操作,但我肯定会尝试修复它,看看它是否能正常工作。

可能还有其他原因,但实际上您应该从
gltextorage3d()
调用中得到
GL\u INVALID\u ENUM
错误:

GLES30.glTexStorage3D(GLES30.GL_TEXTURE_2D_ARRAY, 1, GLES30.GL_RGBA,
                      width, height, res.length);
gltextorage3d()
只支持大小合适的内部格式,这意味着
GL_RGBA
不是有效的格式。如果每个组件需要8位,正确的调用是:

GLES30.glTexStorage3D(GLES30.GL_TEXTURE_2D_ARRAY, 1, GLES30.GL_RGBA8,
                      width, height, res.length);

这并不能解释GL\u INVALID\u操作的原因,但我肯定会尝试解决这个问题,看看它是否能正常工作。

不再有黑色立方体!谢谢奇怪的是,返回的错误是错误的,尽管没有更多的黑色立方体!谢谢奇怪的是,返回的错误是错误的