博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenGL学习二十四:绘制像素,位图,图像
阅读量:4212 次
发布时间:2019-05-26

本文共 9128 字,大约阅读时间需要 30 分钟。

除了几何图形的渲染,还有两种重要的类型的数据渲染

位图:由0和1组成的矩形数组(采用黑白,0为黑1,为白)
图像数据:每个像素包含好几段数据(RGBA)

当前光栅位置

当前光栅位置就是开始绘制下一副位图或图像的屏幕位置,光栅坐标需要经过模型投影矩阵变换
glRasterPos{234}{sifd} (TYPE x, TYPE y,TYPE z,TYPE w);

当前窗口位置

glWindowPos{23}{sifd} (TYPE x, TYPE y,TYPE z);
设置当前窗口位置,不需要经过模型投影矩阵变换

glOrtho (-20, 80, 0, h, -1.0, 1.0);

左图1:光栅坐标
右图2:窗口坐标

绘制位图

glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);

xorig,yorig定义了光栅的原点,它根据当前光栅位置确定的,正值在当前光栅的上面和右面,负值在当前的下面和左面

xmove,ymove表示位图光栅化后光栅位置的增加量

说明:如果位图信息数据包含N个字节,位图高度为M,那么每行所包含的字节数为n/m根据此内容渲染位图0,1 来达到期望的效果

图像

void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);

从帧缓冲区读取一个矩形像素数组,并把数据保存在内存中

glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);

把内存中保存的一个矩形像素数组写入到帧缓冲区中由glRasterPos指定的当前位置

glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum buffer);
从帧缓冲区读取一个矩形像素数组,并把数据保存在内存中
buffer:GL_DEPTH(GL_DEPTH_COMPONENT)
GL_STENCIL(GL_STENCIL_INDEX)
GL_COLOR(GL_RGBA或GL_COLOR_INDEX)

放大,缩小或旋转图像

void glPixelZoom(Glfloat zoomx,Glfloat zoomy)
设置像素的写入操作glDrawPixels,glCopyPixels中x,y方向的放大或缩小因子,默认值都是1.0,如果它们都是2.0,图像每个像素被绘制4个屏幕像素,可以使用负的缩放因子,负的缩放因子根据当前光栅位置对图像进行翻转。正常图片是自底向上,从左到用,如果Y为负数,图像映射到屏幕上就是自顶向下的

glRasterPos2i(0, 0);

//glPixelZoom (2, 2);//1
glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB, GL_UNSIGNED_BYTE, checkImage);
//glPixelZoom (1, 1);//2
glRasterPos2i (250, 0);
glCopyPixels(0,0,checkImageWidth,checkImageHeight,GL_COLOR);

左边的图为glDrawPixels,右边的图是glCopyPixels

将1,2处解开,可见DrawPixels大小放大2*2倍,glCopyPixels在2*2倍 再次放大1*1倍

将1,2处解开,可见DrawPixels大小放大2*2倍,glCopyPixels在2*2倍 再次放大1*1倍

由此可见不显示调用glPixelZoom (1, 1),默认与使用原来放大倍数再次放大

glReadPixels与glDrawPixels所使用的像素格式
GL_COLOR 1个颜色索引值
GL_RG
GL_RGB
GL_RGBA
GL_BGR
GL_BGRA
GL_RED
GL_GREEN
GL_BLUE
GL_ALPHA
GL_LUMINANCE 一个亮度成分
GL_LUMINANCE_ALPHA 一个亮度成分和一个alpha成分
GL_STENCIL_INDEX 一个模板索引值
GL_DEPTH_COMPONENT 一个深度成分
GL_DEPTH_STENCIL 深度成分和模板成分混合

glReadPixels与glDrawPixels所使用的数据类型
GL_UNSIGNED_BYTE
GL_BYTE
GL_BITMAP
GL_UNSIGNED_SHORT
GL_SHORT
GL_UNSIGNED_INT
GL_INT
GL_FLOAT
GL_HALF_FLOAT
GL_UNSIGNED_BYTE_3_3_2
GL_UNSIGNED_BYTE_2_3_3_REV REV后缀专门用于微软操作系统
GL_UNSIGNED_SHORT_5_6_5
GL_UNSIGNED_SHORT_5_6_5_REV
GL_UNSIGNED_SHORT_4_4_4_4
GL_UNSIGNED_SHORT_4_4_4_4_REV
GL_UNSIGNED_SHORT_5_5_5_1
GL_UNSIGNED_SHORT_1_5_5_5_REV
GL_UNSIGNED_INT_8_8_8_8
GL_UNSIGNED_INT_8_8_8_8_REV
GL_UNSIGNED_INT_10_10_10_2
GL_UNSIGNED_INT_2_10_10_10_REV
GL_UNSIGNED_INT_24_8

像素格式与数据类型匹配关系
GL_UNSIGNED_BYTE_3_3_2 GL_RGB
GL_UNSIGNED_BYTE_2_3_3_REV GL_RGB
GL_UNSIGNED_SHORT_5_6_5 GL_RGB
GL_UNSIGNED_SHORT_5_6_5_REV GL_RGB
GL_UNSIGNED_SHORT_4_4_4_4 GL_RGBA,GL_BGRA
GL_UNSIGNED_SHORT_4_4_4_4_REV GL_RGBA,GL_BGRA
GL_UNSIGNED_SHORT_5_5_5_1 GL_RGBA,GL_BGRA
GL_UNSIGNED_SHORT_1_5_5_5_REV GL_RGBA,GL_BGRA
GL_UNSIGNED_INT_8_8_8_8 GL_RGBA,GL_BGRA
GL_UNSIGNED_INT_8_8_8_8_REV GL_RGBA,GL_BGRA
GL_UNSIGNED_INT_10_10_10_2 GL_RGBA,GL_BGRA
GL_UNSIGNED_INT_2_10_10_10_REV GL_RGBA,GL_BGRA
GL_UNSIGNED_INT_24_8 GL_DEPTH_STENCIL
GL_UNSIGNED_INT_10F_11F_11F GL_RGB
GL_UNSIGNED_INT_5_9_9_9_REV GL_RGB
GL_FLOAT_32_UNSIGNED_INT_24_8_REV GL_DEPTH_STENCIL

位图DEMO
#include "header.h"	#include 
GLubyte space[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};GLubyte letters[][13] = {{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, //a{0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, //b{0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, //c{0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, //d{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, //e{0xc0, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, //f{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}};GLuint fontOffset;void makeRasterFont(void){ GLuint i, j; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); fontOffset = glGenLists (128); for (i = 0,j = 'A'; i < 26; i++,j++) { glNewList(fontOffset + j, GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]); glEndList(); } glNewList(fontOffset + ' ', GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space); glEndList();}void init(void){ glShadeModel (GL_FLAT); makeRasterFont();}void printString(char *s){ glPushAttrib (GL_LIST_BIT); glListBase(fontOffset); glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); glPopAttrib ();}void display(void){ GLfloat white[3] = { 1.0, 1.0, 1.0 }; glClear(GL_COLOR_BUFFER_BIT); glColor3fv(white); glRasterPos2i(20, 60); printString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); glRasterPos2i(20, 40); printString("OVER A LAZY DOG"); glFlush ();}void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho (0.0, w, 0.0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW);}void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); }}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(300, 100); glutInitWindowPosition (100, 100); glutCreateWindow("位图"); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0;}
绘制像素DEMO
#include "header.h"/*	Create checkerboard image	*/#define	checkImageWidth 64#define	checkImageHeight 64GLubyte checkImage[checkImageHeight][checkImageWidth][3];static GLdouble zoomFactor = 1.0;static GLint height;void makeCheckImage(void){   int i, j, c;       for (i = 0; i < checkImageHeight; i++) {      for (j = 0; j < checkImageWidth; j++) {         c = ((((i&0x8)==0)^((j&0x8))==0))*255;         checkImage[i][j][0] = (GLubyte) c;         checkImage[i][j][1] = (GLubyte) c;         checkImage[i][j][2] = (GLubyte) c;      }   }}void init(void){       glClearColor (0.0, 0.0, 0.0, 0.0);   glShadeModel(GL_FLAT);   makeCheckImage();   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);}void display(void){   glClear(GL_COLOR_BUFFER_BIT);   glRasterPos2i(0, 0);   glPixelZoom (2, 2);   glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB, 	   GL_UNSIGNED_BYTE, checkImage);   //glPixelZoom (1, 1);   glRasterPos2i (250, 0);   glCopyPixels(0,0,checkImageWidth,checkImageHeight,GL_COLOR);   glFlush();}void reshape(int w, int h){   glViewport(0, 0, (GLsizei) w, (GLsizei) h);   height = (GLint) h;   glMatrixMode(GL_PROJECTION);   glLoadIdentity();   gluOrtho2D(0.0, (GLdouble) w, 0, (GLdouble) h);   glMatrixMode(GL_MODELVIEW);   glLoadIdentity();}void keyboard(unsigned char key, int x, int y){   switch (key) {      case 'r':      case 'R':         zoomFactor = 1.0;         glutPostRedisplay();         printf ("zoomFactor reset to 1.0\n");         break;      case 'z':         zoomFactor += 0.5;         if (zoomFactor >= 3.0)             zoomFactor = 3.0;         printf ("zoomFactor is now %4.1f\n", zoomFactor);         break;      case 'Z':         zoomFactor -= 0.5;         if (zoomFactor <= 0.5)             zoomFactor = 0.5;         printf ("zoomFactor is now %4.1f\n", zoomFactor);         break;      case 27:         exit(0);         break;      default:         break;   }}int main(int argc, char** argv){   glutInit(&argc, argv);   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);   glutInitWindowSize(512, 512);   glutInitWindowPosition(100, 100);   glutCreateWindow(argv[0]);   init();   glutDisplayFunc(display);   glutReshapeFunc(reshape);   glutKeyboardFunc(keyboard);   glutMainLoop();   return 0; }

转载地址:http://kfumi.baihongyu.com/

你可能感兴趣的文章
ACM POJ catalogues[转载]
查看>>
ACM经历总结[转载]
查看>>
C/C++文件操作[转载]
查看>>
专业计划
查看>>
小米笔试:最大子数组乘积
查看>>
常见的排序算法
查看>>
5.PyTorch实现逻辑回归(二分类)
查看>>
6.PyTorch实现逻辑回归(多分类)
查看>>
8.Pytorch实现5层全连接结构的MNIST(手写数字识别)
查看>>
9.PyTorch实现MNIST(手写数字识别)(2卷积1全连接)
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
中间数
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>