OpenGL的位图和图像

OPENGL的位图和图象
     与一般的位图定义不同,OPENGL中的位图是指用每个象素只有一位信息;而图象一个象素可以包括多个信息(R、G、B、Alpha值)。 
另外位图可以用于掩码,遮掩别的图象,而图象的数据则简单的覆盖先前的存在的数据或者与之融合。 
 
(一)位图(BITMAP)和字符(FONT) 
	常常用来对窗口相应区域屏蔽,比如当前颜色为红色,则在矩阵中元素值为1的地方用红色取代,0的地方保持不变。位图常用在字符显示。 
 
光栅位置: 
void glRasterPos{234}{sifd}[v](TYPE x,TYPE y,TYPE z,TYPE w); 
	设置当前所画位图或图象的原点。一般颜色的设置应该放在glRasterPos*() 的前面,则紧跟其后的位图都继承当前设置的这种颜色。 
 
位图显示: 
void glBitmap(GLsizei width,GLsizei height,GLfloat xbo,GLflaot ybo, 
              GLfloat xbi,GLfloat ybi,const GLubyte *bitmap); 
xbo,ybo定义位图的原点,详细可参见例子: 

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA


// 
//sample.cpp 
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
//定义字符位图,从下到上(即第一个数据是字模的最下一行,依次类推): 
//       11111111 
//       11111111 
//       11000011 
//       11000011 
//       11000011 
//       11111111 
//       11111111 
//       11000011 
//       11000011 
//       11000011 
//       11111111 
//       11111111 
//组成一个 8 字  
GLubyte rasters[12]={0xff,0xff,0xc3,0xc3,0xc3,0xff,0xff, 
0xc3,0xc3,0xc3,0xff,0xff}; 

void myinit(void) 
{ 
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
	auxInitPosition(0,0,500,500); 
	auxInitWindow("sample1"); 
	glClearColor(0.0,0.0,0.0,0.0); 
	glClear(GL_COLOR_BUFFER_BIT); 
	
	//描述位图数据在计算机内存中的存储方式,不必深究 
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);	
} 

void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
	glViewport(0,0,w,h); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	glOrtho(0,w,0,h,-1.0,1.0); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
} 

void CALLBACK display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
	
	//先定义红色填充: 
    glColor3f(1.0,0.0,1.0); 
	glRasterPos2i(100,200); 
	//在2个不同位置绘制 8 (紫色) 
	glBitmap(8,12,0.0,0.0,20.0,20.0,rasters); 
	glBitmap(8,12,0.0,0.0,20.0,20.0,rasters); 
	
	//绘制另一个 8 (黄色) 
	glColor3f(1.0,1.0,0.0); 
	glRasterPos2i(150,200); 
    glBitmap(8,12,0.0,0.0,0.0,0.0,rasters); 
	
    glFlush(); 
} 
void main(void) 
{ 
    myinit(); 
	
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
/// 
 
(二)图象 
 
字符显示只是个小内容,我想大家也许会更关心图象的显示 
1.象素读写 
OPENGL提供基本象素读写函数: 
void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,  
                   GLenum format, GLenum type, GLvoid *pixels );  
函数参数(x,y)定义图象区域左下角坐标,width height描述图象宽高。 
pixel是指针,指向图象数据数组。format指出数据元素格式(索引或R、G、B、A值): 
 
format:                   			说明: 
GL_INDEX                  		单个颜色索引 
GL_RGB                    		依次 红、绿、蓝分量 
GL_RED                    		单个红色分量 
GL_GREEN                  	单个绿色分量 
GL_BLUE                   		单个蓝色分量 
GL_ALPHA                  	单个Alpha值 
GL_LUMINANCE_ALPHA        
GL_STENCIL_INDEX     	单个模板索引 
GL_DEPTH_COMPONENT       单个深度分量 
 
而type指出元素数据类型: 
type: 
GL_UNSIGNED_BYTE          	无符号8位整数 
GL_BYTE                   		8位整数 
GL_BITMAP                 	无符号8位整数数组中单个数位 
GL_UNSIGNED_SHORT         无符号16位整数 
GL_SHORT                  	16位整数 
GL_UNSIGNED_INT           	无符号32位整数 
GL_INT                    		32位整数 
GL_FLOAT                  		单精度浮点数 
 
类似的写象素函数: 
void glDrawPixels( GLsizei width, GLsizei height, GLenum format,  
                   GLenum type, const GLvoid *pixels );  
 
2.象素拷贝 
void glCopyPixels( GLint x, GLint y, GLsizei width,  GLsizei height, GLenum type );  
这个函数很类似先用glReadPixels()然后调用glDrawPixels(),但是它不消耗系统内存,只是拷贝, 
type可以是:GL_COLOR GL_STENCIL GL_DEPTH 
在拷贝前,type要按如下方式转换成format: 
1)type为GL_DEPTH GL_STENCIL 那么format 对应应该是GL_DEPTH_COMPONENT 
或GL_STENCIL_INDEX 
2)type为GL_COLOR 那么format 应该是GL_RGB或GL_COLOR_INDEX。 
 
3.图象缩放 
void glPixelZoom(GLfloat zoomx,GLfloat zoomy); 
zoomx zoomy是X Y方向的缩放因子。缺省是1.0。 


#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA


// 
//sample.cpp  
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 

void myinit(void) 
{ 
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
	auxInitPosition(0,0,500,500); 
	auxInitWindow("sample1"); 
	glClearColor(0.0,0.0,0.0,0.0); 
	glClear(GL_COLOR_BUFFER_BIT); 
	
	//      glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
} 

void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
	
	glViewport(0,0,w,h); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	
	if(w<=h) 
		gluOrtho2D(0.0,15.0,0.0,15.0*(GLfloat)h/(GLfloat)w); 
	else 
		gluOrtho2D(0.0,15.0*(GLfloat)w/(GLfloat)h,0.0,15.0); 
	
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
} 

void draw() 
{ 
	//绘制一个彩色三角形(2D) 
	glBegin(GL_TRIANGLES); 
	glColor3f(1.0,0.0,0.0); 
	glVertex2f(2.0,3.0); 
	glColor3f(0.0,1.0,0.0); 
	glVertex2f(12.0,3.0); 
	glColor3f(0.0,0.0,1.0); 
	glVertex2f(7.0,12.0); 
	glEnd(); 
} 

void CALLBACK display(void) 
{ 
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
	
	//在屏幕上方绘制原始图象 
    glPushMatrix(); 
	glLoadIdentity(); 
	glTranslatef(4.0,8.0,0.0); 
	glScalef(0.5,0.5,0.5); 
	draw(); 
	glPopMatrix(); 
	
	int i; 
	for(i=0;i<5;i++) 
	{ 
		//循环5次画出5个拷贝 
		//先定义显示缩放因子(递增) 
		glPixelZoom(1.0+0.1*i,1.0+0.1*i); 
		//再定义拷贝原点(越来越向右上) 
		glRasterPos2i(1+i*2,i); 
		//图象拷贝 
		glCopyPixels(160,310,180,160,GL_COLOR); 
	} 
	
	glFlush(); 
} 
void main(void) 
{ 
    myinit(); 
	
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
 
 
	这个例子在屏幕上方中央绘制一个彩色三角然后在下面从左到右,依次绘制它的拷贝,拷贝位置不断向右上方向 
而且(通过增加缩放因子)新的拷贝变的越来越大。 
当然后绘制的拷贝会遮盖前面的图形。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值