本文共 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 |
#include "header.h" #include绘制像素DEMOGLubyte 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;}
#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/