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()
- OpenGL API 之 glTransfer
- OpenGL API 之 glTexImage2D
- OpenGL API 之 glPixelStore
- OpenGL API 之 glPixelMap
- OpenGL API 之 glTexImage2D
- OpenGL API 之 glTexImage2D
- OpenGL API 之 glTexImage2D
- OpenGL API 之 glTexEnv
- OpenGL学习之API详解
- OpenGL API 之 glPixelStore(2)
- 【OpenGL游戏开发之二】OpenGL常用API
- opengl api
- openGl API
- OpenGL API
- Android OpenGL ES学习笔记之常用API
- OpenGL之画三角形以及常用API详解。
- OpenGL API glDrawElements
- Java OpenGL API
- Python逐行读取文件内容
- 算法导论11(散列表)
- oc 学习资源
- TCP-IP协议
- Scala的数据类型和基础语法
- OpenGL API 之 glTransfer
- example: call cuda toolkit curand API from common lisp
- 1280 前m大的数
- 啊三大三大三大阿斯顿
- ios 5个iOS应用开发者海外学习资源站推荐
- ratio_to_report()分析函数
- 【移动开发】AIDL中callback的实现
- 详解邦邦掌柜网络电话的直拨和回拨区别
- Effective C++ 读书笔记 条款24:若所有参数皆需类型转换,则为此采用non-member 函数