OpenGL API 之 glTransfer

1. 简介

glTransfer用来设置像素传输模式

2. 函数原型

// 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所对应的取值

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 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值