Graphics 版 (精华区)

发信人: dht (bbs), 信区: Graphics
标  题:  OPENGL(9)
发信站: 紫 丁 香 (Sun Oct  4 21:46:39 1998), 转信

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定义位图的原点,详细可参见例子:
如果xbo,ybo不在0,0,则会引起位图出现位置,
即以原来位图中的(xbo,ybo)放在RasterPos(x,y)上,完整绘制一次该位图
//////////////////////////////////////////////////////////////////
//sample.cpp
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
#include "windows.h"
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 "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
#include "windows.h"
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
////////////////////////////////////////////////////////////

这个例子在屏幕上方中央绘制一个彩色三角
然后在下面从左到右,依次绘制它的拷贝,拷贝位置不断向右上方向
而且(通过增加缩放因子)新的拷贝变的越来越大。
当然后绘制的拷贝会遮盖前面的图形。

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.708毫秒