【问题标题】:OpenGL ES2.0 glTexImage2D() returns GL_INVALID_VALUEOpenGL ES2.0 glTexImage2D() 返回 GL_INVALID_VALUE
【发布时间】:2017-08-18 03:22:52
【问题描述】:

我在我的一台 Android 设备(Samsung N5100 平板电脑)上尝试生成纹理(用于字体图集)时遇到问题。下面的代码在 iOS 和我的三星 S4 上运行良好。

glTextImage2D() 不断返回 GL_INVALID_VALUE。

起初我认为这是 2 的幂问题,但我尝试硬编码各种 2 值的幂,但它仍然失败。 GL_MAX_TEXTURE_SIZE 返回值 4096,但我什至无法让 16x16 工作。

  glActiveTexture( GL_TEXTURE0 );
  glGenTextures( 1, &m_TextureAtlasStrip );
  glBindTexture( GL_TEXTURE_2D, m_TextureAtlasStrip );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );

  if( CheckGLError() )
    LogDebugf( "FAIL(9)" );

  GLint f = 0;
  glGetIntegerv( GL_MAX_TEXTURE_SIZE, &f );
  LogDebugf( "GL_MAX_TEXTURE_SIZE: %d", f );

  if( CheckGLError() )
    LogDebugf( "FAIL(9F)" );

//nPow2RoundWidth = 2048;
//nPow2RoundWidth  = 1024;
//nPow2RoundWidth  = 512;
nPow2RoundWidth  = 16;
nPow2RoundHeight = 16;
LogDebugf( "nPow2RoundWidth: %d  nPow2RoundHeight: %d", nPow2RoundWidth, nPow2RoundHeight );

  glTexImage2D( GL_TEXTURE_2D, 0, GL_RED, nPow2RoundWidth, nPow2RoundHeight, 0, GL_RED, GL_UNSIGNED_BYTE, 0 );

  if( CheckGLError() )
  {
    LogDebugf( "AT FAIL(10)" );
    exit( 1 );
  }

  LogDebugf( "WORKED AT (10)" );
  exit( 1 );

这是什么原因造成的?

更新: 如果我将 GL_RED 更改为 GL_RGB 它可以工作..

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, nPow2RoundWidth, nPow2RoundHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0 );

【问题讨论】:

  • 在 openGL ES 2.0 中,GL_LUMINANCE 和 GL_LUMINANCE_ALPHA 工作正常。您可以将获取的值用于着色器代码中的任何内容。我倾向于坚持 GL_LUMINANCE(单个值)、GL_LUMINANCE_ALPHA(两个值)、GL_RGB(三个值)和 GL_RGBA 的顺序...

标签: android opengl-es opengl-es-2.0 texture2d


【解决方案1】:

spec 的表 3.8 定义了 glTexImage2Dinternalformatformat 的有效值

它们是GL_ALPHAGL_LUMINANCEGL_LUMINANCE_ALPHAGL_RGBGL_RGBA

根据您想要达到的具体目标,您可能会发现GL_LUMINANCEGL_ALPHA 可以是合适的替代品。

另外,this extension 确实支持红色(和红绿色)纹理,我认为这很常见,但并非无处不在。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多