EGL错误:“纹理资源为NULL,未指定级别”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EGL错误:“纹理资源为NULL,未指定级别”相关的知识,希望对你有一定的参考价值。

我收到EGL错误:EGL错误:type = 0x824c,severity = 0x9146,message =“纹理资源为NULL,未指定级别”

在下面的前3行代码中为texId1执行glTextSubImage时会出现此错误。 texId2没有错误。想知道是否有其他人对这个错误可能是什么有任何想法?

在debugMessagecallback中可以看到此错误,并且关联的glGetError()是GL_INVALID_OPERATION。

   //render loop
   glBindTexture(GL_TEXTURE_2D, (GLuint)texId1);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_textureWidth,    g_textureHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelsdata1);

   glBindTexture(GL_TEXTURE_2D, 0); //unbind tex


   glBindTexture(GL_TEXTURE_2D, (GLuint)texId2);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_textureWidth,      g_textureHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelsdata2);

   glBindTexture(GL_TEXTURE_2D, 0); //unbind tex

答案

好的,这是发生了什么,因此选择这个作为这篇文章的自我答案。我创建纹理的统一代码,我也尝试将其默认为白色。我这样做是通过分配m_tex = Texture2D.whiteTexture来实现的。意图是做一些像m_tex.whiteTexture;这是不允许的,所以最终我去了:-)

在引擎盖下看起来Unity正在使用我在意外重建的Texture2D.whiteTexture上的glTexStorage2D()调用,使其不可变。事实上,我必须调整原始tex的大小,这对我来说很明显,我得到了一个新的纹理而不是颜色变化,但是我专注于解释我的本机代码中的gl调用和错误代码。评论这些whiteTexture并调整大小后不再出现gl错误:

m_tex = new Texture2D(1920, 1080, TextureFormat.RGBA32, false);
m_tex.filterMode = FilterMode.Bilinear;

//m_tex = Texture2D.whiteTexture;
//m_tex.Resize(1920, 1080);
m_tex.Apply();

还有一个注意事项我继续使用glTexSubImage2D调用,其中pixeldata与上面的原始帖子中的同一个调用中传递。我不使用glTexImage。我猜Unity在所有纹理创建上使用ARB_texture_storage extension,从而使这些纹理不可变。这是扩展中的注释:

When using this extension, it is no longer possible to supply texture
data using TexImage*. Instead, data can be uploaded using TexSubImage*,
or produced by other means (such as render-to-texture, mipmap generation,
or rendering to a sibling EGLImage).

谢谢你@ Rabbid76和@solidpixel。我相信所有评论都会对其他人有用。干杯:-)

以上是关于EGL错误:“纹理资源为NULL,未指定级别”的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Android 模拟器上运行 mapsActivity 时出现 EGL 错误

egl 表面属性未实现?

我的OpenGL学习进阶之旅EGL简介

E/libEGL:Nexus 9 + Android 6 上的 validate_display:255 错误 3008 (EGL_BAD_DISPLAY)

Android OpenGL 开发---EGL 的使用

EGL 在处理程序中创建 iframe