GLCONVOLUTIONFILTER2D(3G)
โจ NAME โจ
glConvolutionFilter2D โ bestie, this is the one that defines a two-dimensional convolution filter ๐ (and yeah, the manual page itself lives in section 3G, so GLCONVOLUTIONFILTER2D(3G) is the whole vibe, iykyk)
๐ธ C SPECIFICATION ๐ธ
void glConvolutionFilter2D( GLenum target,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
const GLvoid *image )
๐ PARAMETERS ๐
targetโ literally has to beGL_CONVOLUTION_2D. That's it, that's the whole personality. ๐ โโ๏ธinternalformatโ the internal format of the convolution filter kernel, okay? The allowable values areGL_ALPHA,GL_ALPHA4,GL_ALPHA8,GL_ALPHA12,GL_ALPHA16,GL_LUMINANCE,GL_LUMINANCE4,GL_LUMINANCE8,GL_LUMINANCE12,GL_LUMINANCE16,GL_LUMINANCE_ALPHA,GL_LUMINANCE4_ALPHA4,GL_LUMINANCE6_ALPHA2,GL_LUMINANCE8_ALPHA8,GL_LUMINANCE12_ALPHA4,GL_LUMINANCE12_ALPHA12,GL_LUMINANCE16_ALPHA16,GL_INTENSITY,GL_INTENSITY4,GL_INTENSITY8,GL_INTENSITY12,GL_INTENSITY16,GL_R3_G3_B2,GL_RGB,GL_RGB4,GL_RGB5,GL_RGB8,GL_RGB10,GL_RGB12,GL_RGB16,GL_RGBA,GL_RGBA2,GL_RGBA4,GL_RGB5_A1,GL_RGBA8,GL_RGB10_A2,GL_RGBA12, orGL_RGBA16. Yes that's a lot, she's got options, we love a versatile icon ๐widthโ how wide the pixel array thatimagepoints at is.heightโ how tall that pixel array is. ๐formatโ the format of the pixel data chillin' insideimage. The allowable values areGL_RED,GL_GREEN,GL_BLUE,GL_ALPHA,GL_RGB,GL_BGR,GL_RGBA,GL_BGRA,GL_LUMINANCE, andGL_LUMINANCE_ALPHA.typeโ the type of the pixel data inimage. These symbolic constants are accepted:GL_UNSIGNED_BYTE,GL_BYTE,GL_BITMAP,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. Slay. โจimageโ a pointer to a two-dimensional array of pixel data that gets processed to build the convolution filter kernel. That's the main character right there. ๐
๐ DESCRIPTION ๐
glConvolutionFilter2D builds a two-dimensional convolution filter kernel out of an array of pixels. no cap, that's the whole job.
The pixel array specified by width, height, format, type, and image gets extracted from memory and processed exactly as if glDrawPixels were called โ except processing stops right after the final expansion to RGBA is completed. ๐
Then the R, G, B, and A components of each pixel get scaled by the four 2D GL_CONVOLUTION_FILTER_SCALE parameters and biased by the four 2D GL_CONVOLUTION_FILTER_BIAS parameters. (Those scale and bias params are set by glConvolutionParameter using the GL_CONVOLUTION_2D target and the names GL_CONVOLUTION_FILTER_SCALE and GL_CONVOLUTION_FILTER_BIAS. The parameters themselves are vectors of four values, applied to red, green, blue, and alpha, in that order.) And listen โ the R, G, B, and A values are not clamped to [0,1] at any time during this process. They're free, they're unbothered. ๐ฆ
Each pixel is then converted to the internal format specified by internalformat. This conversion is basically just mapping the component values of the pixel (R, G, B, and A) onto the values included in the internal format (red, green, blue, alpha, luminance, and intensity). The mapping goes like this:
GL_ALPHAโ Alpha =AGL_LUMINANCEโ Luminance =RGL_LUMINANCE_ALPHAโ Alpha =A, Luminance =RGL_INTENSITYโ Intensity =RGL_RGBโ Red =R, Green =G, Blue =BGL_RGBAโ Red =R, Green =G, Blue =B, Alpha =A
The red, green, blue, alpha, luminance, and/or intensity components of the resulting pixels are stored in floating-point rather than integer values. ๐พ They form a two-dimensional filter kernel image indexed with coordinates i and j, such that i starts at zero and increases from left to right, and j starts at zero and increases from bottom to top. Kernel location i,j is derived from the Nth pixel, where N is i+j*width. Yes, it's math, but it's cute math. ๐งฎ
Heads up bestie: after a convolution is performed, the resulting color components are also scaled by their correspondingGL_POST_CONVOLUTION_c_SCALEparameters and biased by their correspondingGL_POST_CONVOLUTION_c_BIASparameters (wherectakes on the valuesRED,GREEN,BLUE, andALPHA). Those parameters are set byglPixelTransfer. Double-processing energy, we love her. ๐
๐ซถ NOTES ๐ซถ
glConvolutionFilter2D is only present if GL_ARB_imaging is returned when glGetString is called with an argument of GL_EXTENSIONS. So like, vibe check first, okay? ๐
๐ญ ERRORS ๐ญ
GL_INVALID_ENUMis generated iftargetis notGL_CONVOLUTION_2D.GL_INVALID_ENUMis generated ifinternalformatis not one of the allowable values.GL_INVALID_VALUEis generated ifwidthis less than zero or greater than the maximum supported value. You can query that value withglGetConvolutionParameterusing targetGL_CONVOLUTION_2Dand nameGL_MAX_CONVOLUTION_WIDTH.GL_INVALID_VALUEis generated ifheightis less than zero or greater than the maximum supported value. You can query that value withglGetConvolutionParameterusing targetGL_CONVOLUTION_2Dand nameGL_MAX_CONVOLUTION_HEIGHT.GL_INVALID_ENUMis generated ifformatis not one of the allowable values.GL_INVALID_ENUMis generated iftypeis not one of the allowable values.GL_INVALID_OPERATIONis generated ifglConvolutionFilter2Dis executed between the execution ofglBeginand the corresponding execution ofglEnd. ๐ซ (do not do this, I am begging)GL_INVALID_OPERATIONis generated ifheightis 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. (yes it literally saysheightthere, I'm just the messenger fr ๐)GL_INVALID_OPERATIONis generated ifheightis 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. (again:height. iconic of the manpage honestly ๐)
๐ ASSOCIATED GETS ๐
glGetConvolutionParameterglGetConvolutionFilter
๐ฆ SEE ALSO ๐ฆ
glConvolutionFilter1D(3G)glSeparableFilter2D(3G)glConvolutionParameter(3G)glPixelTransfer(3G)
and that's the page bestie!! ๐ the footer down at the bottom is just GLCONVOLUTIONFILTER2D(3G) all over again โ no extra version, no date, just the section 3G name echoing back at you like a little mirror. periodt. ๐
โจ๐ธ
๐ฆ where this page comes from
- opensuse-leap 16.0: Mesa-libGL-devel 24.1.7-160000.3.1 ยท MIT
- opensuse-leap 16.0: Mesa-libGL-devel 24.3.3-160000.3.1 ยท MIT
- opensuse-leap 16.0: Mesa-libGL-devel 24.3.3-160000.3.1 ยท MIT
- opensuse-leap 16.0: Mesa-libGL-devel 24.3.3-160000.3.1 ยท MIT
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms