主题:[原创]OpenGL入门学习——第十课
eastcowboy
[专家分:25370] 发布于 2007-04-19 20:10:00
现在放出第十课的内容。
首先还是以前课程的连接:
[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 楼
zhvickie [专家分:0] 发布于 2007-05-05 23:07:00
好啊
12 楼
bhdgx [专家分:110] 发布于 2007-05-11 17:16:00
学习中,谢谢搂主
13 楼
conqest [专家分:0] 发布于 2007-05-13 11:53:00
我想显示字母该怎么做啊?
14 楼
eastcowboy [专家分:25370] 发布于 2007-05-13 15:12:00
[quote]我想显示字母该怎么做啊?[/quote]
在以后的教程中可能提到这个问题。但现在,你可以把每个字母放到一个BMP文件中,并利用本次课程所讲的内容将它显示到屏幕上的合适位置。
15 楼
zhvickie [专家分:0] 发布于 2007-05-15 11:38:00
能不能做个例子,关于rotate,transfer,zoom,restore to the original的效果。
16 楼
xxyqiufeng [专家分:20] 发布于 2007-05-25 16:19:00
楼住加油
17 楼
ASDFDGDG [专家分:0] 发布于 2007-06-01 16:56:00
■■优秀期刊(晋级、职称、毕业)论文征稿
★《各界》文论系经国家新闻出版总署批准的公开发行的省级综合学术期刊。主办单位:陕西省政协。国内统一刊号: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 楼
Rick0ne [专家分:1490] 发布于 2007-06-07 11:29:00
写得真是太好了,感谢~!
19 楼
freemoon [专家分:0] 发布于 2007-06-26 21:35:00
我试了一下您的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 楼
`凯猪` [专家分:190] 发布于 2008-02-23 13:36:00
以下转贴: 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;
我来回复