• 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()  
  • 相关阅读:
    穿戴式眼镜显示屏方案
    centos8 shell脚本定时restart workerman问题
    cmake中文文档(一)-编译命令行工具
    Dear ImGui中文文档(一)
    PHP实现布隆过滤算法
    case when的记录
    前端的一些记录
    z-index 弹出元素被原本页面的元素遮挡住
    DevExpress 导出pdf中文不显示或者乱码问题
    DevExpress控件位置的微调
  • 原文地址:https://www.cnblogs.com/lyx2018/p/7056215.html
Copyright © 2020-2023  润新知