OpenGL ES2.0 glTexImage2D() returns GL_INVALID_VALUE
OpenGL ES2.0 glTexImage2D() returns GL_INVALID_VALUE
我在我的 Android 设备(三星 N5100 平板电脑)上尝试生成纹理(用于字体图集)时遇到问题。下面的代码在 iOS 和我的三星 S4 上运行良好。
glTextImage2D() 不断返回 GL_INVALID_VALUE。
起初我认为这是 2 的幂问题,但我尝试硬编码各种 2 的幂值,但它仍然失败。 GL_MAX_TEXTURE_SIZE returns 值为 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 );
Table spec 的 3.8 定义了 internalformat
和 glTexImage2D
的 format
的有效值
它们是 GL_ALPHA
、GL_LUMINANCE
、GL_LUMINANCE_ALPHA
、GL_RGB
和 GL_RGBA
。
具体取决于您要实现的目标,您可能会发现 GL_LUMINANCE
或 GL_ALPHA
可能是合适的替代品。
或者,this extension 确实支持红色(和红-绿)纹理,我认为这很常见,但并非无处不在。
我在我的 Android 设备(三星 N5100 平板电脑)上尝试生成纹理(用于字体图集)时遇到问题。下面的代码在 iOS 和我的三星 S4 上运行良好。
glTextImage2D() 不断返回 GL_INVALID_VALUE。
起初我认为这是 2 的幂问题,但我尝试硬编码各种 2 的幂值,但它仍然失败。 GL_MAX_TEXTURE_SIZE returns 值为 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 );
Table spec 的 3.8 定义了 internalformat
和 glTexImage2D
format
的有效值
它们是 GL_ALPHA
、GL_LUMINANCE
、GL_LUMINANCE_ALPHA
、GL_RGB
和 GL_RGBA
。
具体取决于您要实现的目标,您可能会发现 GL_LUMINANCE
或 GL_ALPHA
可能是合适的替代品。
或者,this extension 确实支持红色(和红-绿)纹理,我认为这很常见,但并非无处不在。