最初的電子計算機,只能顯示單色(綠色或琥珀色)圖形,每個像素只有兩種狀態打開和關閉。在計算器圖形學前期,圖像數據是用位圖來表示的,位圖就是一系列的0和1,表示打開或關閉的像素值。下圖就是用位圖表示的一匹馬:函數
下圖是同一匹馬的灰度圖,在這個像素圖中有256種不一樣強度的灰度級。oop
位圖這個術語也常應用於包含灰度級和全綵色的圖像數據,特別是在Windows平臺上有相應的位圖格式.BMP文件。嚴格地講,這是對位圖這個術語的誤用。在此處(正確地說),位圖是隻有打開和關閉這兩種值的二進制圖。咱們用像素圖來表示那些包含全綵色和強度值的圖像數據。spa
位圖是從底往上構建的,也就是說位圖的第一行數據表明着位圖圖像的最底部的一行。下面是一個例子,建立一個512X512的窗口,在窗口中填充16行、16列篝火圖像的位圖:.net
#include "gltools.h"
//篝火位圖
GLubyte fire[128] = { 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0,
0x00, 0x00, 0x01, 0xf0,
0x00, 0x00, 0x07, 0xf0,
0x0f, 0x00, 0x1f, 0xe0,
0x1f, 0x80, 0x1f, 0xc0,
0x0f, 0xc0, 0x3f, 0x80,
0x07, 0xe0, 0x7e, 0x00,
0x03, 0xf0, 0xff, 0x80,
0x03, 0xf5, 0xff, 0xe0,
0x07, 0xfd, 0xff, 0xf8,
0x1f, 0xfc, 0xff, 0xe8,
0xff, 0xe3, 0xbf, 0x70,
0xde, 0x80, 0xb7, 0x00,
0x71, 0x10, 0x4a, 0x80,
0x03, 0x10, 0x4e, 0x40,
0x02, 0x88, 0x8c, 0x20,
0x05, 0x05, 0x04, 0x40,
0x02, 0x82, 0x14, 0x40,
0x02, 0x40, 0x10, 0x80,
0x02, 0x64, 0x1a, 0x80,
0x00, 0x92, 0x29, 0x00,
0x00, 0xb0, 0x48, 0x00,
0x00, 0xc8, 0x90, 0x00,
0x00, 0x85, 0x10, 0x00,
0x00, 0x03, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00 };
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
for (int y = 0; y < 16; ++y)
{
//設置光柵的位置
glRasterPos2i(0, 32 * y);
for (int x = 0; x < 16; ++x)
{
//繪製位圖,繪製完成後,在x軸上移動32個像素
glBitmap(32, 32, 0.0f, 0.0f, 32.0f, 0.0f, fire);
}
}
glutSwapBuffers();
}
void ChangeSize(int w, int h)
{
if (h == 0)
h = 1;
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//設置投影的大小與屏幕的寬高對應
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SetupRC()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
int main(int args, char *argv[])
{
glutInit(&args, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
//建立512X512的窗口
glutInitWindowSize(512, 512);
glutCreateWindow("BITMPAS");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
效果:指針
for (int y = 0; y < 16; ++y)
{
//設置光柵化的位置
glRasterPos2i(0, 32 * y);
for (int x = 0; x < 16; ++x)
{
//繪製位圖,繪製完成後,在x軸上移動32個像素
glBitmap(32, 32, 0.0f, 0.0f, 32.0f, 0.0f, fire);
}
}
在這個例子中,咱們故意設置OpenGL的投影與窗口的大小匹配,這樣咱們就至關於用窗口的座標來指定位圖的位置。然而這樣的方式有時不太方便,因此OpenGL提供了另一個可選的函數,容許你設置光柵的位置爲窗口的座標,從而忽略變換矩陣和投影對座標的影響。code
void glWindowPos2i(GLint x, GLint y);get
設置光柵位置時須要注意的一個地方,在glRasterPos或者glWindowPos調用以前設置的顏色將被當作位圖的顏色。在glRasterPos和glWindowPos以後調用glColor不會影響位圖的顏色。it
最終咱們調用繪製位圖的命令,把位圖繪製到顏色緩衝區。ast
glBitmap(32, 32, 0.0, 0.0, 32.0, 0.0, fire);渲染
glBitmap函數把圖像數據拷貝到顏色緩衝區的當前的光柵位置,而且能夠進行可選的移動光柵位置的操做。
void glBitmap(GLsize width, GLsize height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, GLubyte *bitmap);
頭兩個參數指定爲位圖的寬和高,xorig和yorig指定位圖數據的原點。xmove和ymove指定在渲染完位圖以後,光柵位置往x軸和y軸移動多少個像素。bitmap是一個指向位圖數據的指針。PS:當一幅位圖被繪製時,圖像中只有位模式爲1的片斷纔會在顏色緩衝區中被建立,爲0則不會影響當前的顏色緩衝區。