opengl之glpixelmap

 
 

1. 简介 

glPixelMap设置像素传输中的像素映射

2. 函数原型

[cpp] view plain copy
 
  1. // c style  
  2. void glPixelMapfv(GLenum  map,  GLsizei  mapsize,  const GLfloat *  values);  
  3. void glPixelMapuiv(GLenum  map,  GLsizei  mapsize,  const GLuint *  values);  
  4. void glPixelMapusv(GLenum  map,  GLsizei  mapsize,  const GLushort *  values);  
[python] view plain copy
 
  1. # python style  
  2. def glPixelMapfv( map , mapsize , values )   
  3. def glPixelMapuiv( map , mapsize , values )  
  4. def glPixelMapusv( map , mapsize , values )   

参数描述:

[plain] view plain copy
 
  1. map:  
  2.   指明一个映射的选项名称,可选的取值有  
  3.     GL_PIXEL_MAP_I_TO_I  
  4.     GL_PIXEL_MAP_S_TO_S  
  5.     GL_PIXEL_MAP_I_TO_R  
  6.     GL_PIXEL_MAP_I_TO_G  
  7.     GL_PIXEL_MAP_I_TO_B  
  8.     GL_PIXEL_MAP_I_TO_A  
  9.     GL_PIXEL_MAP_R_TO_R  
  10.     GL_PIXEL_MAP_G_TO_G  
  11.     GL_PIXEL_MAP_B_TO_B  
  12.     GL_PIXEL_MAP_A_TO_A  
  13. mapsize:  
  14.   设置映射区域的大小  
  15. values:  
  16.   设置映射区域的值  

3. 详细描述

glPixelMap设置像素传输的转换表(或者称为对应关系),当设置之后,它会影响如下API的作用效果:

glCopyPixels,glCopyTexImage1D,glCopyTexImage2D,glCopyTexSubImage1D,glCopyTexSubImage2D,glCopyTexSubImage3D,glDrawPixels,glReadPixels,glTexImage1D,glTexImage2D,glTexImage3D,glTexSubImage1D,glTexSubImage2DglTexSubImage3D

如果 ARB_imaging扩展开启,那么以下API的调用也会受到glPixelMap的影响:

glColorTableglColorSubTableglConvolutionFilter1DglConvolutionFilter2DglHistogramglMinmaxglSeparableFilter2D

glPixelMap中的mapsize的参数定义了映射的数组的大小(mapsize的大小必须是2的n次方,否则结果未定义),value指向实际数组的地址(如果开启了PBO,那么value的作用就是PBO中的偏移量)下表列出了glPixelMap中参数的初始值:

map取值查询索引(源)查询索引(目标)初始值初始值
GL_PIXEL_MAP_I_TO_I 颜色索引值 颜色索引值 1 0
GL_PIXEL_MAP_S_TO_S 模板索引值 模板索引值 1 0
GL_PIXEL_MAP_I_TO_R 颜色索引值 红色 1 0
GL_PIXEL_MAP_I_TO_G 颜色索引值 绿色 1 0
GL_PIXEL_MAP_I_TO_B 颜色索引值 蓝色 1 0
GL_PIXEL_MAP_I_TO_A 颜色索引值 Alpha 1 0
GL_PIXEL_MAP_R_TO_R 红色 红色 1 0
GL_PIXEL_MAP_G_TO_G 绿色 绿色 1 0
GL_PIXEL_MAP_G_TO_B 蓝色 蓝色 1 0
GL_PIXEL_MAP_G_TO_A Alpha Alpha 1 0

4. 示例

我们现在要做这样一个功能:反转一张图片,让图片中的颜色变为它的互补色。假设我们设置mapsize的大小是255,并设置value的取值是从1.0到0.0按255的级别递减,也就是:

[python] view plain copy
 
  1. mapArray = [1];  
  2. for i in range(1, 256):  
  3.     mapArray.append(1.0- ((1.0)/255.0)*i)  

然后我们使用GL_PIXEL_MAP_R_TO_R、GL_PIXEL_MAP_G_TO_G、GL_PIXEL_MAP_G_TO_B让颜色通过映射表中的颜色得到它的处理后的颜色。假设图片中某一像素的颜色是RGB(255,127,127),那么它映射的计算过程如下:先把颜色从[0,255](颜色的取值范围)映射到mapsize这个大小上,也就是 R = round(255/255)*255、G=round(127/255)*255、B=round(127/255)*255 = R(255,127,127)然后利用得到的索引值去mapArray数组中查询对应地方的颜色得到最终RGB是(0.0,0.5,0.5),最后将得到的结果进行处理并绘制出来。

[python] view plain copy
 
  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3. import sys  
  4.   
  5. from OpenGL.GL import *  
  6. from OpenGL.GLU import *  
  7. from OpenGL.GLUT import *  
  8. from PIL.Image import *  
  9.   
  10. ix = 0  
  11. iy = 0  
  12. data = None  
  13.   
  14. def gl_init():  
  15.     glClearColor(0.0, 0.0, 0.0, 0.0)  
  16.     image = open("textures/lzl.png")  
  17.     global ix  
  18.     global iy  
  19.     ix = image.size[0]  
  20.     iy = image.size[1]  
  21.     global data  
  22.     data = image.tobytes("raw", "RGBX", 0, -1)  
  23.     glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)  
  24.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)  
  25.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)  
  26.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)  
  27.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)  
  28.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)  
  29.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)  
  30.     glEnable(GL_TEXTURE_2D)  
  31.   
  32. def keyboard(key, x, y):  
  33.     global data  
  34.     global ix  
  35.     global iy  
  36.   
  37.     if key == ' ':  
  38.         glPixelTransferi(GL_MAP_COLOR, GL_TRUE)  
  39.         mapArray = [1];  
  40.         for i in range(1, 256):  
  41.             mapArray.append(1.0- ((1.0)/255.0)*i)  
  42.         glPixelMapfv(GL_PIXEL_MAP_R_TO_R, 255, mapArray)  
  43.         glPixelMapfv(GL_PIXEL_MAP_G_TO_G, 255, mapArray)  
  44.         glPixelMapfv(GL_PIXEL_MAP_B_TO_B, 255, mapArray)  
  45.   
  46.     glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)  
  47.     glutPostRedisplay()  
  48.   
  49. def display():  
  50.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)  
  51.     glLoadIdentity()  
  52.     glTranslatef(0.0, 0.0, -3.0)  
  53.     glBegin(GL_QUADS)  
  54.     glTexCoord2f(0,0)  
  55.     glVertex3f(-1, -1, 0)  
  56.     glTexCoord2f(1,0)  
  57.     glVertex3f(1, -1, 0)  
  58.     glTexCoord2f(1,1)  
  59.     glVertex3f(1, 1, 0)  
  60.     glTexCoord2f(0,1)  
  61.     glVertex3f(-1, 1, 0)  
  62.     glEnd()  
  63.     glutSwapBuffers()  
  64.   
  65.   
  66. def resize(w, h):  
  67.     if h == 0:  
  68.         h = 1  
  69.     glViewport(0, 0, w, h)  
  70.     global windowWidth  
  71.     global windowHeight  
  72.     windowWidth = w  
  73.     windowHeight = h  
  74.   
  75.     glMatrixMode(GL_PROJECTION)  
  76.     glLoadIdentity()  
  77.     gluPerspective(45.0, float(w)/float(h), 0.001, 1000)  
  78.     glMatrixMode(GL_MODELVIEW)  
  79.     glLoadIdentity()  
  80.   
  81.   
  82. def main():  
  83.     glutInit(sys.argv)  
  84.     glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE)  
  85.     glutInitWindowSize(640, 480)  
  86.     glutInitWindowPosition(500, 500)  
  87.     glutCreateWindow(u"OpenGL像素传输")  
  88.     glutDisplayFunc(display)  
  89.     glutReshapeFunc(resize)  
  90.     glutKeyboardFunc(keyboard)  
  91.     gl_init()  
  92.     glutMainLoop()  
  93.   
  94.   
  95. if __name__ == '__main__':  
  96.     main()  
原文地址:https://www.cnblogs.com/lyx2018/p/7056215.html