glTransfer用来设置像素传输模式
// c style void glPixelTransferf(GLenum pname, GLfloat param); void glPixelTransferi(GLenum pname, GLint param);
# python style def glPixelTransferf( pname , param ) def glPixelTransferi( pname , param )
参数描述:
pname: 设置像素传输参数,可以设置为以下值中的一个 GL_MAP_COLOR GL_MAP_STENCIL GL_INDEX_SHIFT GL_INDEX_OFFSET GL_RED_SCALE GL_RED_BIAS GL_GREEN_SCALE GL_GREEN_BIAS GL_BLUE_SCALE GL_BLUE_BIAS GL_ALPHA_SCALE GL_ALPHA_BIAS GL_DEPTH_SCALE GL_DEPTH_BIAS 如果启用ARB_imaging扩展,那么也可以选择以下值 GL_POST_COLOR_MATRIX_RED_SCALE GL_POST_COLOR_MATRIX_GREEN_SCALE GL_POST_COLOR_MATRIX_BLUE_SCALE GL_POST_COLOR_MATRIX_ALPHA_SCALE GL_POST_COLOR_MATRIX_RED_BIAS GL_POST_COLOR_MATRIX_GREEN_BIAS GL_POST_COLOR_MATRIX_BLUE_BIAS GL_POST_COLOR_MATRIX_ALPHA_BIAS GL_POST_CONVOLUTION_RED_SCALE GL_POST_CONVOLUTION_GREEN_SCALE GL_POST_CONVOLUTION_BLUE_SCALE GL_POST_CONVOLUTION_ALPHA_SCALE GL_POST_CONVOLUTION_RED_BIAS GL_POST_CONVOLUTION_GREEN_BIAS GL_POST_CONVOLUTION_BLUE_BIAS GL_POST_CONVOLUTION_ALPHA_BIAS param: 设置pname所对应的取值
glPixelTransfer设置像素传输模式,在调用之后,会影响到如下API的一些作用:
glCopyPixels,glCopyTexImage1D,glCopyTexImage2D,glCopyTexSubImage1D,glCopyTexSubImage2D,glCopyTexSubImage3D,glDrawPixels,glReadPixels,glTexImage1D,glTexImage2D,glTexImage3D,glTexSubImage1D,glTexSubImage2D,glTexSubImage3D
如果启用ARB_imaging扩展,那么以下API的调用也会受到影响:
glColorTable,glColorSubTable,glConvolutionFilter1D,glConvolutionFilter2D,glHistogram,glMinmax,glSeparableFilter2D
PixelTransfer会处理四种类型的像素,这四种类型包括颜色模式、索引模式、深度模式和模板模式,这些数据有着各自不同的特点。具体来说颜色模式包含四种成分(RGBA),每种成分的取值范围在[0,1],颜色索引模式和模板模式都需要进行索引的查表来获取相应的值,深度模式和颜色模式类似,取值在[0,1],不同的是它只有一个成分。
当glPixelTransfer中的param取值GL_MAP_COLOR或者GL_MAP_STENCIL为GL_TRUE的时候,则映射模式开启,我们需要设置glPixelMap的内容glPixelTransfer对于这四种类型像素处理的详细内容:
一般使用如下的计算公式:某一成分计算结果(截断到[0,1]之间) = 原始值 * GL_该成分_SCALE + GL_该成分_BIAS,最后将这些成分组合成结果的RGBA值
通过指定的GL_INDEX_SHIFT和GL_INDEX_OFFSET来指定颜色索引从索引表中的一个子集中进行选择
和颜色模式计算公式类似
和颜色索引模式的计算类似
示例中将读入的像素颜色修改之后输出,可以通过1,2,3选择输出图片不同通道的颜色(红色、绿色、蓝色)
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from PIL.Image import * ix = 0 iy = 0 data = None def gl_init(): glClearColor(0.0, 0.0, 0.0, 0.0) image = open("textures/lzl.png") global ix global iy ix = image.size[0] iy = image.size[1] global data data = image.tobytes("raw", "RGBX", 0, -1) glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glEnable(GL_TEXTURE_2D) def keyboard(key, x, y): global data global ix global iy if key == '1': glPixelTransferf(GL_RED_SCALE, 1) glPixelTransferf(GL_GREEN_SCALE, 0) glPixelTransferf(GL_BLUE_SCALE, 0) if key == '2': glPixelTransferi(GL_RED_SCALE, 0) glPixelTransferi(GL_GREEN_SCALE, 1) glPixelTransferi(GL_BLUE_SCALE, 0) if key == '3': glPixelTransferi(GL_RED_SCALE, 0) glPixelTransferi(GL_GREEN_SCALE, 0) glPixelTransferi(GL_BLUE_SCALE, 1) glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data) glutPostRedisplay() def display(): glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) glLoadIdentity() glTranslatef(0.0, 0.0, -3.0) glBegin(GL_QUADS) glTexCoord2f(0,0) glVertex3f(-1, -1, 0) glTexCoord2f(1,0) glVertex3f(1, -1, 0) glTexCoord2f(1,1) glVertex3f(1, 1, 0) glTexCoord2f(0,1) glVertex3f(-1, 1, 0) glEnd() glutSwapBuffers() def resize(w, h): if h == 0: h = 1 glViewport(0, 0, w, h) global windowWidth global windowHeight windowWidth = w windowHeight = h glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0, float(w)/float(h), 0.001, 1000) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE) glutInitWindowSize(640, 480) glutInitWindowPosition(500, 500) glutCreateWindow(u"OpenGL像素传输") glutDisplayFunc(display) glutReshapeFunc(resize) glutKeyboardFunc(keyboard) gl_init() glutMainLoop() if __name__ == '__main__': main()