OpenGL ES2.0 glTexImage2D()返回GL_INVALID_VALUE

时间:2017-03-25 03:28:47

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

我尝试在我的某个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 );

1 个答案:

答案 0 :(得分:2)

spec的表3.8定义internalformat的{​​{1}}和format的有效值

他们是glTexImage2DGL_ALPHAGL_LUMINANCEGL_LUMINANCE_ALPHAGL_RGB

根据您要实现的目标,您可能会发现GL_RGBAGL_LUMINANCE可能是合适的替代品。

或者,this extension确实支持红色(和红绿色)纹理,我认为它很常见,但不是无处不在。