OpenGL API 之 glTransfer

来源:互联网 发布:苏联专家 知乎 编辑:程序博客网 时间:2024/05/21 22:23

1. 简介

glTransfer用来设置像素传输模式

2. 函数原型

// c stylevoid glPixelTransferf(GLenum  pname,  GLfloat  param);void glPixelTransferi(GLenum  pname,  GLint  param);

# python styledef glPixelTransferf( pname , param ) def glPixelTransferi( pname , param ) 

参数描述:

pname:  设置像素传输参数,可以设置为以下值中的一个GL_MAP_COLORGL_MAP_STENCILGL_INDEX_SHIFTGL_INDEX_OFFSETGL_RED_SCALEGL_RED_BIASGL_GREEN_SCALEGL_GREEN_BIASGL_BLUE_SCALEGL_BLUE_BIASGL_ALPHA_SCALEGL_ALPHA_BIASGL_DEPTH_SCALEGL_DEPTH_BIAS  如果启用ARB_imaging扩展,那么也可以选择以下值GL_POST_COLOR_MATRIX_RED_SCALEGL_POST_COLOR_MATRIX_GREEN_SCALEGL_POST_COLOR_MATRIX_BLUE_SCALEGL_POST_COLOR_MATRIX_ALPHA_SCALEGL_POST_COLOR_MATRIX_RED_BIASGL_POST_COLOR_MATRIX_GREEN_BIASGL_POST_COLOR_MATRIX_BLUE_BIASGL_POST_COLOR_MATRIX_ALPHA_BIASGL_POST_CONVOLUTION_RED_SCALEGL_POST_CONVOLUTION_GREEN_SCALEGL_POST_CONVOLUTION_BLUE_SCALEGL_POST_CONVOLUTION_ALPHA_SCALEGL_POST_CONVOLUTION_RED_BIASGL_POST_CONVOLUTION_GREEN_BIASGL_POST_CONVOLUTION_BLUE_BIASGL_POST_CONVOLUTION_ALPHA_BIASparam:  设置pname所对应的取值

3. 详细描述

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对于这四种类型像素处理的详细内容:

3.1. 颜色模式

一般使用如下的计算公式:某一成分计算结果(截断到[0,1]之间) = 原始值 * GL_该成分_SCALE + GL_该成分_BIAS,最后将这些成分组合成结果的RGBA值

3.2. 颜色索引模式

通过指定的GL_INDEX_SHIFT和GL_INDEX_OFFSET来指定颜色索引从索引表中的一个子集中进行选择

3.3. 深度模式

和颜色模式计算公式类似

3.4. 模板模式

和颜色索引模式的计算类似

4. 示例

示例中将读入的像素颜色修改之后输出,可以通过1,2,3选择输出图片不同通道的颜色(红色、绿色、蓝色)

#!/usr/bin/env python# -*- coding: utf-8 -*-import sysfrom OpenGL.GL import *from OpenGL.GLU import *from OpenGL.GLUT import *from PIL.Image import *ix = 0iy = 0data = Nonedef 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()
0 0
原创粉丝点击