Android OpenGL ES对纹理存储的无效操作
我正在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,所以第三个条件也不应该匹配 导致无效操作错误的原因是什么?另外,无效操作错误是我的黑色纹理的原因,还是与此无关 下面是我加载阵列纹理的方式: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
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操作的原因,但我肯定会尝试解决这个问题,看看它是否能正常工作。不再有黑色立方体!谢谢奇怪的是,返回的错误是错误的,尽管没有更多的黑色立方体!谢谢奇怪的是,返回的错误是错误的