除了几何图形的渲染,还有两种重要的类型的数据渲染
位图:由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 <string.h>
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;
}
相关推荐
总的来说,通过学习NEHE的OpenGL位图和图像教程,你将获得关于位图加载、纹理创建、纹理应用等方面的基础知识,这将为你进一步探索复杂的3D图形和动画打下坚实基础。记得实践是检验真理的唯一标准,理论知识与实际...
这个"一个OpenGL的显示位图实例"可能是一个教学示例,旨在教授如何在OpenGL环境中加载和显示位图图像。位图是一种像素数组,常用于游戏、图形用户界面(GUI)和其他需要直接图像控制的应用。 在OpenGL中显示位图,...
在OpenGL中,我们可以通过加载这些位图并逐像素地绘制它们来显示文本。 首先,我们需要创建位图字体的头文件和源文件。这些文件通常包含关于字体的元数据,如字符的宽度、高度、偏移量等,以及每个字符对应的位图...
### OpenGL入门学习之十——BMP文件与像素操作 #### 关键知识点概览: 1. **像素图与矢量图的区别** 2. **BMP文件格式解析** 3. **OpenGL中的像素操作** #### 详细解释: **一、像素图与矢量图的区别** 在...
位图是一种常见的图像文件格式,用于存储像素数据。在OpenGL中,我们通常使用`glTexImage2D`函数将位图数据加载到纹理对象中,然后通过纹理坐标和顶点坐标在屏幕上渲染这个位图。这个过程涉及到图像格式转换、数据...
BMP是一种常见的位图文件格式,包含了图像的像素数据。在本教程中,我们将深入探讨如何使用OpenGL打开并显示一张BMP图片。 首先,理解OpenGL的基本概念至关重要。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D...
总的来说,"OpenGL位图纹理"是一个展示如何在3D场景中应用位图图像作为纹理的技术。通过VS2005和GLUT,我们可以轻松地构建一个演示项目,体验位图纹理带来的视觉效果。这个项目不仅可以帮助初学者理解OpenGL纹理操作...
要使用OpenGL绘制位图字体,首先需要一个位图字体库或者创建自己的字体位图资源。这些资源通常包含每个字符的位图图像,以及有关字体大小、间距和高度的信息。在MFC中,我们可以利用CBitmap类来加载和管理这些位图...
位图文字是将每个字符编码为一个二维像素数组,通常以.png或.bmp格式存储。在OpenGL中,我们可以通过加载这些位图文件,然后在屏幕上定位和绘制每个字符来显示文字。这种方法简单易行,但缺点是分辨率依赖性强,放大...
OpenGL 的像素操作函数提供了许多函数来处理像素的操作,包括指定光栅位置、绘制位图、从帧缓存中读取像素、将像素写人帧缓存等。 * glRasterPos:为像素操作指定光栅位置 * glBitmap:绘制位图 * glReadPixels:从...
OpenGL的API提供了物体表述、平移、旋转、缩放、光照、纹理、材质、像素、位图、交互一级提高显示性能等多方面的功能,基本涵盖了开发二维、三维图形程序所需的各个方面。 OpenGL的特点包括: * 跨平台特性 * 应用...
对于中文字符,这意味着我们需要为每个汉字创建一个对应的位图图像。这通常涉及到以下步骤: 1. **字体生成**:首先,你需要一个包含中文字符的字体文件,如TrueType (.ttf)或OpenType (.otf)。然后,使用工具(如...
它通过一个位图图案来控制像素的绘制,这个位图通常包含黑白两种颜色,黑色表示不绘制像素,白色则表示绘制。在我们的蝴蝶图像中,这个位图可能是一个预先设计好的蝴蝶形状,当应用于屏幕上的特定区域时,会显示出...
在OpenGL中加载和使用BMP(Bitmap)图像文件是常见的需求,因为BMP格式是一种简单且普遍支持的位图图像格式。本文将深入探讨如何在OpenGL环境中读取和显示BMP图像文件。 首先,理解BMP文件格式是关键。BMP文件存储...
学习C++位图知识,不仅有助于理解和处理图像数据,还能为开发涉及图像处理的应用程序打下坚实基础。Visual C++.docx文档很可能是对以上知识的详细讲解,包含了C++编程中操作位图的具体步骤和示例,建议仔细阅读以...
- **功能描述**:用于指定颜色数据的格式和存储位置,以便OpenGL可以在绘制时自动读取颜色信息。这通常与glDrawArrays()等函数配合使用,实现高效的颜色数据传递。 **glIndex**: 设置当前索引颜色。 - **功能描述**...
2. **显示位图**:将位图数据加载到内存后,可以使用图形库(如OpenGL、GDI+或DirectX)将其绘制到屏幕上。这通常涉及到将像素数据映射到屏幕坐标系统,并调用相应的绘图函数。 3. **修改位图**:位图的每个像素都...
通过对比不同版本的OpenGL绘制立方体的方法,展示OpenGL技术的演进和现代图形编程的复杂性。 通过这个初级教程,你将建立起对OpenGL的基础理解,能够编写简单的图形应用程序,并为进一步深入学习OpenGL和图形编程...