回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第十课

现在放出第十课的内容。

首先还是以前课程的连接:

[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=185032]第四课,颜色的选择[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196017]第五课,三维的空间变换[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=196231]第六课,动画的制作[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=218828]第七课,使用光照来表现立体感[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=219518]第八课,使用显示列表[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=224877]第九课,使用混合来实现半透明效果[/url]
第十课,BMP文件与像素操作  ——→  [color=0000FF]本次课程的内容[/color]

今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BMP图象”等内容比较感兴趣的话,可能不知不觉就看完了。
像素操作可以很复杂,这里仅涉及了简单的部分,让大家对OpenGL像素操作有初步的印象。

=====================未完,请勿跟帖=====================

回复列表 (共26个回复)

11 楼

好啊

12 楼

学习中,谢谢搂主

13 楼

我想显示字母该怎么做啊?

14 楼

[quote]我想显示字母该怎么做啊?[/quote]
在以后的教程中可能提到这个问题。但现在,你可以把每个字母放到一个BMP文件中,并利用本次课程所讲的内容将它显示到屏幕上的合适位置。

15 楼

能不能做个例子,关于rotate,transfer,zoom,restore to the original的效果。

16 楼

楼住加油

17 楼


■■优秀期刊(晋级、职称、毕业)论文征稿 
★《各界》文论系经国家新闻出版总署批准的公开发行的省级综合学术期刊。主办单位:陕西省政协。国内统一刊号:CN61-1302/D 国际刊号:ISSN1007-3906  邮发代号:52-148。系为高学历人群发表论文服务的高品位学术期刊。本刊系国际大16开本,精美印刷。已被《中国核心期刊(遴选)数据库》、《中国学术期刊(光盘版)》、《万方数据数字化期刊群》、《龙源期刊网》等网络媒体吸收。
★办刊宗旨:坚持参政议政,建言献策;坚持传播科技理念、报道科技前沿、倡导科技创新、促进科技进步。
 
★刊登内容:主要刊登我国当前科技及与科技发展有关的政治、哲学、教育、经济、管理等方面有一定学术和应用价值的学术论文和反映各学科、各领域的新成果、新工艺、新产品等方面的论述文章。
 
★栏目设置:人事行政   政法天地  经典理论  能源战略   教育研究  经营管理  金融
财会  信息科学   教学交流   文化艺术。
 
★滚动栏目:国防科技   高新技术  工程技术   建筑科学    IT技术  电子商务   环境资源  财会审计  医疗保健   学术论坛  行业科技  实践创新   经济综述   图书论坛。
 
★投稿要求:稿件应具有科学性、先进性和实用性,论点明确、论据可靠、数据准确、逻辑严谨、文字通顺;计量单位以国家法定计量单位为准;统计学符号按国家标准《统计学名词及符号》的规定书写;所有文章标题字数控制在20字以内;参考文献按引用的先后顺序列于文末;正确使用标点符号,表格设计要合理,推荐使用三线表;图片要清晰,注明图号;来稿请注明作者姓名、单位、通讯地址、邮编、联系电话及电子信箱,文稿以2600-5200字符为宜,并保证文章版权的独立性。文责自负,勿一稿多投。
 
★杂志社地址: 西安市建国路省政协大楼(西安市建国六巷一号)\邮政信箱:西安市钟楼邮局103信箱《各界》文论编辑部\邮政编码:710003
■  责任编辑: 李志莲
■    联系方式:编辑电话:029—85015100                 QQ:598489186
■    编辑投稿信箱:lizhilian33@163.com       
■    杂志网址:www.gejiewenlun.com

                                                            

18 楼

写得真是太好了,感谢~!

19 楼

我试了一下您的glCopyPixels()的代码,没有画出倒立的三角形,怎么回事呢?谢谢
代码如下,不使用grab()抓图
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
/* 
 * 假设窗口宽度为WindowWidth,高度为WindowHeight
 */
#define WindowWidth  400
#define WindowHeight 400

void mydisplay(void)
{
    // 清除屏幕
    glClear(GL_COLOR_BUFFER_BIT);
    // 绘制
    glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 0.0f, 0.0f);    glVertex2f(0.0f, 0.0f);
        glColor3f(0.0f, 1.0f, 0.0f);    glVertex2f(1.0f, 0.0f);
        glColor3f(0.0f, 0.0f, 1.0f);    glVertex2f(0.5f, 1.0f);
    glEnd();
    glPixelZoom(-0.5f, -0.5f);
    glRasterPos2i(1, 1);
    glCopyPixels(WindowWidth/2, WindowHeight/2, WindowWidth/2, WindowHeight/2, GL_COLOR);
    // 完成绘制,并抓取图象保存为BMP文件
    glutSwapBuffers();
    //grab();
}
int main(int argc,char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(WindowWidth,WindowHeight);
    glutCreateWindow("像素拷贝");
    glutDisplayFunc(&mydisplay);
    glutMainLoop();

    return 0;
}

20 楼

以下转贴:              bmp头文件中有记录pixellength的地方,所以可以不用求了啊,可以先验证这个bmp文件的有效性,如果有效则头文件中很多有用信息都可以直接用,更方便可靠 
 1. BMP文件组成 
  BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 
  2. BMP文件头 
  BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 
  
  其结构定义如下: 
  
  typedef struct tagBITMAPFILEHEADER
  {
  WORDbfType; // 位图文件的类型,必须为BM
  DWORD bfSize; // 位图文件的大小,以字节为单位
  WORDbfReserved1; // 位图文件保留字,必须为0
  WORDbfReserved2; // 位图文件保留字,必须为0
  DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
  // 文件头的偏移量表示,以字节为单位
  } BITMAPFILEHEADER;
  
  3. 位图信息头 
  
  BMP位图信息头数据用于说明位图的尺寸等信息。
  typedef struct tagBITMAPINFOHEADER{
  DWORD biSize; // 本结构所占用字节数
  LONGbiWidth; // 位图的宽度,以像素为单位
  LONGbiHeight; // 位图的高度,以像素为单位
  WORD biPlanes; // 目标设备的级别,必须为1
  WORD biBitCount// 每个像素所需的位数,必须是1(双色),
  // 4(16色),8(256色)或24(真彩色)之一
  DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
  // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
  DWORD biSizeImage; // 位图的大小,以字节为单位
  LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数
  LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数
  DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
  DWORD biClrImportant;// 位图显示过程中重要的颜色数
  } BITMAPINFOHEADER;
  
  4. 颜色表 
  颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下: 
  
  typedef struct tagRGBQUAD {
  BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
  BYTErgbGreen; // 绿色的亮度(值范围为0-255)
  BYTErgbRed; // 红色的亮度(值范围为0-255)
  BYTErgbReserved;// 保留,必须为0
  } RGBQUAD;
  颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
  当biBitCount=1,4,8时,分别有2,16,256个表项;
  当biBitCount=24时,没有颜色表项。
  位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
  typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader; // 位图信息头
  RGBQUAD bmiColors[1]; // 颜色表
  } BITMAPINFO;
  
  
  5. 位图数据 
  位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数: 
  
  当biBitCount=1时,8个像素占1个字节;
  当biBitCount=4时,2个像素占1个字节;
  当biBitCount=8时,1个像素占1个字节;
  当biBitCount=24时,1个像素占3个字节;
  Windows规定一个扫描行所占的字节数必须是
  4的倍数(即以long为单位),不足的以0填充,
  一个扫描行所占的字节数计算方法:
  DataSizePerLine= (biWidth* biBitCount+31)/8; 
  // 一个扫描行所占的字节数
  DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
  位图数据的大小(不压缩情况下):
  DataSize= DataSizePerLine* biHeight;

我来回复

您尚未登录,请登录后再回复。点此登录或注册