GLTEXSUBIMAGE1D(3G)
π GLTEXSUBIMAGE1D(3G) β or as I call it, "the glTexSubImage1D / glTextureSubImage1D glow-up page"
okay so bestie, welcome to the 3G manual page, and honestly? this one is a whole mood. we're doing one-dimensional texture subimages today. one dimension. a line of texels. minimalism, but make it graphics. β¨
πΈ NAME πΈ
glTexSubImage1D, glTextureSubImage1D β specify a one-dimensional texture subimage π
β¨ C SPECIFICATION β¨
here's the signature, no cap, copy it exactly:
void glTexSubImage1D(GLenum target, GLint level, GLint xoffset,
GLsizei width, GLenum format, GLenum type,
const GLvoid * pixels);
void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset,
GLsizei width, GLenum format, GLenum type,
const void *pixels);
π¦ PARAMETERS π¦
every single one, bestie, we're not skipping a thing:
targetβ the target the texture is bound to, forglTexSubImage1D. there's exactly one valid answer and it'sGL_TEXTURE_1D. periodt.textureβ the texture object name, forglTextureSubImage1D. its effective target has to be one of the valid target values listed above (yes,GL_TEXTURE_1D, that one π ).levelβ the level-of-detail number. level0is the base image level. level n is the *n*th mipmap reduction image. mipmap lore π§xoffsetβ a texel offset in the x direction, within the texture array.widthβ the width of the texture subimage.formatβ the format of the pixel data. accepted symbolic values are:GL_RED,GL_RG,GL_RGB,GL_BGR,GL_RGBA,GL_DEPTH_COMPONENT, andGL_STENCIL_INDEX.typeβ the data type of the pixel data. accepted symbolic values are:GL_UNSIGNED_BYTE,GL_BYTE,GL_UNSIGNED_SHORT,GL_SHORT,GL_UNSIGNED_INT,GL_INT,GL_FLOAT,GL_UNSIGNED_BYTE_3_3_2,GL_UNSIGNED_BYTE_2_3_3_REV,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_5_6_5_REV,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_4_4_4_4_REV,GL_UNSIGNED_SHORT_5_5_5_1,GL_UNSIGNED_SHORT_1_5_5_5_REV,GL_UNSIGNED_INT_8_8_8_8,GL_UNSIGNED_INT_8_8_8_8_REV,GL_UNSIGNED_INT_10_10_10_2, andGL_UNSIGNED_INT_2_10_10_10_REV. yes that's a lot. yes you need to know them. π«Άpixelsβ a pointer to the image data in memory. it's giving "raw bytes, handle with care" π
π DESCRIPTION π
so, texturing maps a portion of a specified texture image onto each graphical primitive for which texturing is enabled β iconic behaviour honestly. to enable or disable one-dimensional texturing, call glEnable() and glDisable with argument GL_TEXTURE_1D. π«
glTexSubImage1D and glTextureSubImage1D redefine a contiguous subregion of an existing one-dimensional texture image. the texels referenced by pixels replace the portion of the existing texture array with x indices xoffset and xoffset + width - 1, inclusive. lowkey crucial: this region may not include any texels outside the range of the texture array as it was originally specified. π¨
and the fun little edge case: it is not an error to specify a subtexture with width of 0 β but such a specification has no effect. so like... you can, but why π
aaaand if a non-zero named buffer object is bound to the GL_PIXEL_UNPACK_BUFFER target (see glBindBuffer()) while a texture image is specified, then pixels is treated as a byte offset into the buffer object's data store. plot twist! π₯
π NOTES π
glPixelStore()modes affect texture images. so set your pixel store modes, bestie, they matter.glTexSubImage1DandglTextureSubImage1Dspecify a one-dimensional subtexture for the current texture unit, specified withglActiveTexture().GL_STENCIL_INDEXis accepted forformatonly if the GL version is4.4or higher. gatekept by the version number, smh π
π₯ ERRORS π₯
okay, vibe check time, here's everything that will ruin your whole afternoon:
GL_INVALID_ENUMis generated iftargetor the effective target oftextureis not one of the allowable values.GL_INVALID_OPERATIONis generated byglTextureSubImage1Diftextureis not the name of an existing texture object.GL_INVALID_ENUMis generated ifformatis not an accepted format constant.GL_INVALID_ENUMis generated iftypeis not a type constant.GL_INVALID_VALUEis generated iflevelis less than0.GL_INVALID_VALUEmay be generated iflevelis greater than log 2 max, where max is the returned value ofGL_MAX_TEXTURE_SIZE.GL_INVALID_VALUEis generated ifxoffset< - b, or ifxoffset + width> w - b, where w is theGL_TEXTURE_WIDTH, and b is the width of theGL_TEXTURE_BORDERof the texture image being modified. note that w includes twice the border width. do not forget the border, i'm begging π«GL_INVALID_VALUEis generated ifwidthis less than0.GL_INVALID_OPERATIONis generated if the texture array has not been defined by a previousglTexImage1D()operation.GL_INVALID_OPERATIONis generated iftypeis one ofGL_UNSIGNED_BYTE_3_3_2,GL_UNSIGNED_BYTE_2_3_3_REV,GL_UNSIGNED_SHORT_5_6_5, orGL_UNSIGNED_SHORT_5_6_5_REVandformatis notGL_RGB.GL_INVALID_OPERATIONis generated iftypeis one ofGL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_4_4_4_4_REV,GL_UNSIGNED_SHORT_5_5_5_1,GL_UNSIGNED_SHORT_1_5_5_5_REV,GL_UNSIGNED_INT_8_8_8_8,GL_UNSIGNED_INT_8_8_8_8_REV,GL_UNSIGNED_INT_10_10_10_2, orGL_UNSIGNED_INT_2_10_10_10_REVandformatis neitherGL_RGBAnorGL_BGRA.GL_INVALID_OPERATIONis generated ifformatisGL_STENCIL_INDEXand the base internal format is notGL_STENCIL_INDEX.GL_INVALID_OPERATIONis generated if a non-zero buffer object name is bound to theGL_PIXEL_UNPACK_BUFFERtarget and the buffer object's data store is currently mapped.GL_INVALID_OPERATIONis generated if a non-zero buffer object name is bound to theGL_PIXEL_UNPACK_BUFFERtarget and the data would be unpacked from the buffer object such that the memory reads required would exceed the data store size.GL_INVALID_OPERATIONis generated if a non-zero buffer object name is bound to theGL_PIXEL_UNPACK_BUFFERtarget andpixelsis not evenly divisible into the number of bytes needed to store in memory a datum indicated bytype.
fr fr, that last cluster of GL_PIXEL_UNPACK_BUFFER errors is the final boss of pixel unpacking. read them twice. π
π ASSOCIATED GETS π
the ones you can query, bestie:
glGetTexImage()glGet()with argumentGL_PIXEL_UNPACK_BUFFER_BINDING
π VERSION SUPPORT π
(the original ships this as a big grid of checkmarks β here it is as a list so nothing gets lost, and every β stays a β π¦)
glTexSubImage1Dβ β in OpenGL2.0, β in2.1, β in3.0, β in3.1, β in3.2, β in3.3, β in4.0, β in4.1, β in4.2, β in4.3, β in4.4, β in4.5. she ate and left no crumbs π₯glTextureSubImage1Dβ-in2.0,-in2.1,-in3.0,-in3.1,-in3.2,-in3.3,-in4.0,-in4.1,-in4.2,-in4.3,-in4.4, β in4.5. she was late to the party but she showed up π
β SEE ALSO β
go read these next, i'm obsessed with cross-referencing:
glActiveTexture(), glCopyTexImage1D(), glCopyTexImage2D(), glCopyTexSubImage1D(), glCopyTexSubImage2D(), glCopyTexSubImage3D(), glPixelStore(), glTexImage1D(), glTexImage2D(), glTexImage3D(), glTexParameter(), glTexSubImage2D(), glTexSubImage3D()
πΈ COPYRIGHT πΈ
Copyright Β© 1991-2006 Silicon Graphics, Inc. Copyright Β© 2010-2014 Khronos Group. This document is licensed under the SGI Free Software B License. For details, see http://oss.sgi.com/projects/FreeB/.
π COPYRIGHT π
Copyright Β© 1991-2006 Silicon Graphics, Inc. Copyright Β© 2010-2014 Khronos Group
okay that's the whole page, you're officially a one-dimensional texture subimage girlie now π
and for the cute sign-off: this was the [FIXME: source] version, dated 08/09/2021, filed under GLTEXSUBIMAGE1D(3G) β go forth and texel responsibly, bestie π«Άπ
π¦ where this page comes from
- centos-stream 9: gl-manpages 1.1-24.20190306.el9 Β· MIT and Open Publication
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms