文档库 最新最全的文档下载
当前位置:文档库 › OpenGL进行文字显示的方法

OpenGL进行文字显示的方法

OpenGL进行文字显示的方法
OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。——https://www.wendangku.net/doc/243196979.html,

一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ])

本文来源于ZwqXin(https://www.wendangku.net/doc/243196979.html,/), 转载请注明

原文地址:https://www.wendangku.net/doc/243196979.html,/archives/opengl/opengl-font-setting-showing.html

怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。

而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。

三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。其中前两步比较重要,着重讨论讨论哈~

1. 常规的屏幕字体打印(NormalFont)

应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。

1. /////////一般的英语字体打印

2.void MyFont::BuildGLFont(int fontHeight)

3.{

4. HDC hDC =::GetDC(HWND_DESKTOP); //////就是这里搞晕了半晚

5.

6. int tFontHeight = -1 * fontHeight;

7.

8. NormalFontBase = glGenLists(96); // Storage For 96 Characters

9. HFONT font = CreateFont( -tFontHeight, // Height Of Font

10. 0, // Width Of Font

11. 0, // Angle Of Escapement

12. 0, // Orientation Angle

13. FW_BOLD, // Font Weight

14. TRUE, // Italic

15. FALSE, // Underline

16. FALSE, // Strikeout

17. ANSI_CHARSET, // Character Set Identifier

18. OUT_TT_PRECIS, // Output Precision

19. CLIP_DEFAULT_PRECIS, // Clipping Precision

20. ANTIALIASED_QUALITY, // Output Quality

21. FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch

22. "Georgia"); // Font Name

23.

24. HFONT oldfont = (HFONT)SelectObject(hDC, font); // Selects The Font We Want

25.

26. wglUseFontBitmaps(hDC, 32, 96, NormalFontBase); // Builds 96 Characters Startin

g At Character 32

27.

28. SelectObject(hDC, oldfont); // Selects The Font We Want to return to

29. DeleteObject(font); // Delete The Font

30.

31. SetBkMode(hDC,TRANSPARENT);

32.

33. NormalFont = true;

34.}

其中bUild的时候首先用到的是GDI的CreateFont函数创建字体——这应该是比较常用的方法,设置了关于字体的一切并选入字体后,有一步重要的操作:wglUseFontBitmaps。1.

2.wglUseFontBitmap

3.为当前选中的GDI字体创建一组OpenGL显示列表位图字体

4.BOOL wglUseFontBitmap(HDC hDC, DWORD dwFirst, DWORD dwCount, DWORD dwListBas

e);

5.

6.参数

7.hDC

8.设备环境句柄

9.

10.dwFirst

11.用于创建显示列表字体的第一个字符的ASCII值

12.

13.dwCount

14.字符数

15.

16.dwListBase

17.第一个显示列表的名称

18.

19.返回值

20.成功返回TRUE,否则返回FALSE

21.

输入为DC,32,96以及创建的96个新显示列表的base列表。函数绘制从ASCII码为3 2-128的字符进入显示列表,依赖OPENGL显示列表的高速显示能力(直接从硬件拿存储区),可以方便进行字符的切换。

在Print过程中,调用glCallLists就能调动起这些列表了,但是怎么决定具体要“调动”哪些字母呢(96个之中)?

1.void MyFont::PrintGLText(GLint x, GLint y, const char *string, ...)

2. char text[256];

3. va_list pArguments;

4.

5. if (string == NULL)

6. return;

7.

8. va_start(pArguments, string);

9. vsprintf(text, string, pArguments);

10. va_end(pArguments);

11.

12.

13. glPushAttrib(GL_LIST_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT);

14. glDisable(GL_DEPTH_TEST);

15. glDisable(GL_LIGHTING);

16. glDisable(GL_TEXTURE_2D);

17. glColor4f(mColor[0], mColor[1], mColor[2], mColor[3]);

18.

19. glWindowPos2i(x, y);

20.

21. glListBase(NormalFontBase - 32);

22. glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);

23. glPopAttrib();

24.}

首先看函数形式——printf形式,若想有个详细了解,可到这里看看。简单来说,就是C时代的可变参数列。va_start - vsprintf - (va_arg)- va_end这套机制就是为了把可变参数列的内容,通过va_list (char*指针)一个一个从栈中取出来赋予他者——我们的glCallLists所要接受的所有“具体字符”,通过base为基础的索引快速寻觅而取得对应ASCII字符的字体信息(实际是位图字体),并依照期望使其形成为“具体字符串”印入屏幕。

另外着重介绍的是我所添加的两个优化——它们贯穿三种文字显示方法之中。

其一是glPushAttrib,它与glPopAttrib配合,保证了其之间的OPENGL状态设置的独立性,使其不影响该代码逻辑的前后的具体渲染状态。当然参数取GL_ALL_ATTRIB_BITS是保险点,但只要你弄清楚自己的需要,像上面这样给予特定的状态作为参数效率会更高。恩,颜色,光照,深度测试,混合……选择与当前方法最匹配的状态而没有对状态机的后顾之忧,如同文字本身一样——作为对象完全独立于图形渲染“模块”。

另一是glWindowPos2i(x, y),按《OpenGL编程指南》第8章所说,它取代我们以前用的glRasterPos2i,不再让作为描绘对象的物体承受模型-视图-投影变换之苦[乱弹OpenGL中的矩阵变换(上)] ,而是直接独立到OPENGL世界的出口——屏幕坐标系,如GDI般用窗口坐标(根

据屏幕像素数)来描述文字的起点位置。这同样是赋予文字的独立性,而且意义重大——可知道,当时我用glRasterPos2i多么狼狈,好难才让文字不在场景“里面”乱窜。

在具体应用中,在初始化调用BuildGLFont.,在渲染阶段调用PrintGLText。譬如:

1.//CMAINFRAME

2.MyFont mFont;

3.

4.//初始化:

5.mFont.BuildGLFont(25);//25是字体字高,控制字体大小

6.

7.//渲染阶段(RenderGLScene)

8.

9.mFont.PrintGLText(530, 710, "https://www.wendangku.net/doc/243196979.html, - My 3D Graphics");

10.

11.//将在坐标X = 530, Y =710位置开始绘制文字。对1024*768大小的渲染窗口中,即在右上

注意,OpenGL窗口坐标系的原点在窗口的左下角,横坐标为X,竖坐标为Y,最大值在右上角。(同见[乱弹OpenGL选择-拾取机制Ⅱ] )

浏览一下效果,第一行就是了,因为我默认用的是Georgia字体(应该一般人电脑都有),所以很

漂亮

接下来会谈及其余两种方法,并比较之。真正的纹理文字是怎样弄的呢?怎样让中文字体乖乖显示?什么时候用哪种方法?我集成的MyFont类是怎样个怪样?听下回分解:

在OpenGL上设置字体和显示文字(下)

本文来源于ZwqXin(https://www.wendangku.net/doc/243196979.html,/), 转载请注明

原文地址:https://www.wendangku.net/doc/243196979.html,/archives/opengl/opengl-font-setting-showing.html

Tags: OpenGL代码工具类C 分类:OpenGL技术| 评论:1 | 引用:0 | 浏览:7399

?水效果Ⅰ- 水池在OpenGL上设置字体和显示文字(下) ?

分享到新浪微博QQ空间腾讯微博人人网豆瓣0

?点击这里获取该日志的TrackBack引用地址

?相关文章:

乱弹OpenGL选择-拾取机制(下) (2009-6-14 23:3:8)

乱弹OpenGL选择-拾取机制(上) (2009-6-13 16:54:2)

子类调用父类的纯虚函数之问题 (2009-6-8 23:18:32)

视锥类CFrustum .zwqxin ver (2009-6-2 22:39:52)

标准MFC在OpenGL (2009-5-31 17:46:47)

QuickSort 快速排序的实现 (2009-5-6 1:21:55)

全屏反锯齿- 多重采样Ⅱ (2009-5-3 19:50:7)

全屏反锯齿- 多重采样Ⅰ (2009-5-2 16:21:56)

图像处理里的空间域滤波 (2009-4-27 23:53:18)

一年前,首次献给OpenGL之夜.雷达追踪 (2009-4-5 22:18:52)

在OpenGL上设置字体和显示文字(下)

2009-8-6 10:22:27 | 发布:zwqxin

本篇紧随上篇,继续说一下鄙人所了解的在OpenGL进行文字显示的方法,也方便不知从哪个次元来到这里的学习者提供一点这方面的信息。上一篇见:[在OpenGL上设置字体和显示文字(上)] ——https://www.wendangku.net/doc/243196979.html,

本文来源于ZwqXin (https://www.wendangku.net/doc/243196979.html,/), 转载请注明

原文地址:https://www.wendangku.net/doc/243196979.html,/archives/opengl/opengl-font-setting-showing-2.html

2. 纹理字体

最近接触Irrlicht引擎,里面的GUI模块涉及的字体设置就是用了这种纹理字体的方法。事实上,上篇的方法最后多少了涉及到了位图字体,但是这里所说的,是直接从一张“写着各个英文字符和其他常用字符”的纹理上,按对此纹理上的图案“结构”的先验知识而获取字符对应的“纹理部分”,显示到屏幕上。

换句话来说,这就是真正的纹理贴图了,因此必须结合一张特定设计的“字体纹理”。要显示一个字符,需要你绘制一个一定大小的矩形(这个长度值相当于之前的字体高度——它控制最后出来的文字的大小),然后找到你所需字符在该纹理上的纹理坐标,作为索引检索出纹理上的对应字符部分的小纹理,贴到该矩形上。

1.

2.//////////从字体集纹理中取出的字符

3.void MyFont::BuildTextureFont(GLuint fonttex, int fontHeight, int screenWidth, int screenHeig

ht)

4.{

5. TextureFontFont = fonttex;

6.

7. float cx; // Holds Our X Character Coord

8. float cy; // Holds Our Y Character Coord

9.

10. glEnable(GL_TEXTURE_2D);

11.

12. TextureFontBase = glGenLists(256); // Creating 256 Display Lists

14. glBindTexture(GL_TEXTURE_2D, TextureFontFont); // Select Our Font Texture

15.

16. for(int loop=0; loop<256; loop++) // Loop Through All 256 Lists

17. {

18. cx=float(loop%16)/16.0f; // X Position Of Current Character

19. cy=float(loop/16)/16.0f; // Y Position Of Current Character

20.

21. glNewList(TextureFontBase + loop, GL_COMPILE); // Start Building A List

22. glBegin(GL_QUADS); // Use A Quad For Each Character

23. glTexCoord2f(cx,1-cy-0.0625f); // Texture Coord (Bottom Left)

24. glVertex2i(0,0); // Vertex Coord (Bottom Left)

25. glTexCoord2f(cx+0.0625f,1-cy-0.0625f); // Texture Coord (Bottom Right)

26. glVertex2i(fontHeight, 0); // Vertex Coord (Bottom Right)

27. glTexCoord2f(cx+0.0625f,1-cy); // Texture Coord (Top Right)

28. glVertex2i(fontHeight,fontHeight); // Vertex Coord (Top Right)

29. glTexCoord2f(cx,1-cy); // Texture Coord (Top Left)

30. glVertex2i(0, fontHeight); // Vertex Coord (Top Left)

31. glEnd(); // Done Building Our Quad (Character)

32. glTranslated(fontHeight,0,0); // Move To The Right Of The Character

33. glEndList(); // Done Building The Display List

34. } // Loop Until All 256 Are Built

35.

36. glDisable(GL_TEXTURE_2D);

37.

38. ScreenWidth = screenWidth;

39. ScreenHeight = screenHeight;

40.

41. TextureFont = true;

42.}

这在BUILD阶段就做的必要是没有的,但是一次过导入纹理中256个字符,生成256个小纹理,并在每帧都选择对应的纹理索引检索纹理,且每个字符如此——这样的重复不变而低效的事情,还是由OpenGL的显示列表技术来做比较好——一次过在初始化时做好,放入显示列表。

在PRINT阶段只要调用显示列表就好。关于显示列表,eastcowboy在他的OPENGL入门学习中详细提及过,有兴趣的朋友可看看他的文章:OpenGL入门学习——第八课-使用显示列表。

比起最时兴的VBO,显示列表在重复劳动上还是有一定优势的额~

最后的结果是按glTranslated进行排列的256个具有纹理字符的矩形。为什么要得到渲染窗口的大小呢?因为这些矩形要保证在屏幕最前方,就应该让它突破矩阵变换啊。在上篇[在O penGL上设置字体和显示文字(上)] 也提过glWindowPos2i(x, y),但这里对实际的矩形它不是很适用。因此我还是选择原来的路子,来给予文字以独立于图形的属性——在屏幕最前而位置只由屏幕坐标XY决定。方法就是,或许很多人也熟悉的,glOrtho正交投影变换。因此,屏幕大小(这里指渲染窗口的大小)是需要的。

1.

2.void MyFont::PrintTextureText(GLint x, GLint y, char *string, int TextureSet)

4. if (TextureSet > 1)TextureSet = 1;

5. if (TextureSet < 0)TextureSet = 0;

6.

7. glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT | GL_ENABLE_BIT| GL_LIST_BIT);

8. glDisable(GL_LIGHTING);

9.

10. glEnable(GL_TEXTURE_2D);

11. glBindTexture(GL_TEXTURE_2D, TextureFontFont); // Select Our Font Texture

12.

13. glDisable(GL_DEPTH_TEST); // Disables Depth Testing

14. glEnable(GL_BLEND);

15. glBlendFunc(GL_SRC_ALPHA,GL_ONE);

16.

17. glColor4f(mColor[0], mColor[1], mColor[2], mColor[3]);

18.

19. glMatrixMode(GL_PROJECTION); // Select The Projection Matrix

20. glPushMatrix(); // Store The Projection Matrix

21.

22. glLoadIdentity(); // Reset The Projection Matrix

23. glOrtho(0,ScreenWidth,0,ScreenHeight,-1,1); // Set Up An Ortho Screen

24.

25. glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

26. glPushMatrix(); // Store The Modelview Matrix

27.

28. glLoadIdentity(); // Reset The Modelview Matrix

29. glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left)

30.

31. glListBase(TextureFontBase-32 + (128 * TextureSet));// Choose The Font Set (0 or 1)

32. glCallLists(strlen(string),GL_UNSIGNED_BYTE,string);// Write The Text To The Screen

33.

34. glMatrixMode(GL_PROJECTION); // Select The Projection Matrix

35. glPopMatrix(); // Restore The Old Projection Matrix

36. glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

37. glPopMatrix(); // Restore The Old Projection Matrix

38.

39. glDisable(GL_BLEND);

40. glEnable(GL_DEPTH_TEST); // Enables Depth Testing

41. glDisable(GL_TEXTURE_2D);

42.

43. glPopAttrib();

44.}

TextureSet选择字符集,因为字符纹理里面每个字符对应两种字体,用0/1选择。glPush Attrib的作用前面说过了。之后我们用glPushMatrix保存当前的投影/模型视图矩阵,在弄好一

切好就马上切换回去。弄什么呢?新的坐标变换。文字(glCallLists绘制)是脱离我们OPENGL图形世界的,因此单独给予它一套变换——在屏幕最前方且不受视觉透视影响。glOrtho(0,Screen Width,0,ScreenHeight,-1,1)这样的投影变换设置配合glTranslated这样的模型变换就能满足我的要求了。因为创建的正交投影是与渲染窗口大小一致的,所以glTranslated的X,Y的单位与像素pixel对应——这不也就是GDI那种设置方式了么哈。

具体应用:

1.//CMAINFRAME

2.MyFont mFont;

3.

4.//初始化:

5.mFont.BuildTextureFont(FontTextureID, 25, VB_WIDTH, VB_HEIGHT);

6.//25是字体字高,控制字体大小 ,FontTextureID字体纹理的纹理ID

7.

8.//渲染阶段(RenderGLScene)

9.

10.mFont.PrintTextureText(790,645,"Font Test",1);

11.

12.//将在坐标X = 790, Y =645位置开始绘制文字。对1024*768大小的渲染窗口中,

13.//即在右上角偏下

3.GDI字体

事实上第一种方法也可以说是GDI的方法,但是这里更明显,结合GDI字体创建和位图创建。而且它不涉及显示列表。它是在渲染时动态创建包容文字的设备相关位图(具体可参考我的一篇旧文[认识HBITMAP与Bmp操作(整内存拷贝版)] ),再把此位图定位而成的。

因此,它是很慢的~(抽)。但是为了中文字体,一点点的性能损失算得了什么呢。

1.///////////GDI, 位图字体可设中文字体

2.void MyFont::BuildGDIFont(LPCTSTR lpszFacename, int fontWeights, int fontHeight)

3.{

4. int tfontHeight = -1 * fontHeight;

5. hGDIFont = CreateFont(tfontHeight, 0, 0, 0, fontWeights, 0, 0, 0, GB2312_CHARSET,

6. 0, 0, 0, FF_MODERN, lpszFacename);

7. GDIFont = true;

8.}

BUILD部分就不多说了,就是CreateFont~~fontWeights表示字体的重量,在0~900内可选,直接设置FW_BOLD之类的也行,这里给出这个参数不过是多给它一些可控性而已。首参数是字体,譬如可以是"黑体","宋体"等等,也可以是英文字体。当然这里应该是取你电脑的字库里的字体,所以考虑程序的通用性,别搞些另类的字体或只有自己有的字体~GB2312_CHARSET 你该知道啦哈。

1.void MyFont::PrintfChtext(int x, int y, LPCTSTR lpszText)

2.{

3. CBitmap bitmap;

4. BITMAP bm;

5. SIZE size;

6.

7. HDC MDC = ::CreateCompatibleDC(NULL);

8. SelectObject(MDC, hGDIFont);

9.

10. ::GetTextExtentPoint32(MDC,lpszText,strlen(lpszText),&size);

11.

12. bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);

13.

14. HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,bitmap);

15.

16. SetBkColor (MDC, RGB(0, 0, 0));

17. SetTextColor(MDC, RGB(255, 255, 255));

18.

19. TextOut(MDC, 0, 0, lpszText, strlen(lpszText));

20.

21. bitmap.GetBitmap(&bm);

22. size.cx = (bm.bmWidth + 31) & (~31);

23.

24. int bufsize = size.cy * size.cx;

25.

26. struct {

27. BITMAPINFOHEADER bih;

28. RGBQUAD col[2];

29. }bic;

30.

31. BITMAPINFO *binf = (BITMAPINFO *)&bic;

32. binf->bmiHeader.biSize = sizeof(binf->bmiHeader);

33. binf->bmiHeader.biWidth = bm.bmWidth;

34. binf->bmiHeader.biHeight = bm.bmHeight;

35. binf->bmiHeader.biPlanes = 1;

36. binf->bmiHeader.biBitCount = 1;

37. binf->bmiHeader.biCompression = BI_RGB;

38. binf->bmiHeader.biSizeImage = bufsize;

39.

40. UCHAR* Bits = new UCHAR[bufsize];

41. ::GetDIBits(MDC,bitmap, 0, bm.bmHeight, Bits, binf, DIB_RGB_COLORS);

42.

43. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

44.

45. //glRasterPos2i(x, y);

46. glWindowPos2i(x, y);

47. glBitmap(size.cx, size.cy, 0, 0, 0, 0, Bits);

48.

49. delete Bits;

50. SelectObject(MDC, oldBmp);

51. ::DeleteDC(MDC);

52.}

53.

54.void MyFont::PrintGDIText(GLint x, GLint y, CString str)

55.{

56. glLoadIdentity();

57. glPushAttrib(GL_CURRENT_BIT | GL_LIGHTING_BIT);

58.

59. glDisable(GL_TEXTURE_2D);

60. glDisable(GL_LIGHTING);

61.

62. glColor4f(mColor[0], mColor[1], mColor[2], mColor[3]);

63.

64. PrintfChtext (x, y, str);

65.

66. glPopAttrib();

67.}

glPushAttrib和glWindowPos2i的意义不多说了。看主体函数PrintfChtext。几个GDI函数:

?GetTextExtentPoint32用当前所选字体来计算字符串尺寸,按逻辑单位计算的高和宽都没有考虑裁剪取的情况。

?CreateBitmap创建单位色位图。

函数所做的是依据字符串大小建立一张单色位图,把该位图信息存入UCHAR数组Bits内。

类似的操作在[认识HBITMAP与Bmp操作(整内存拷贝版)] 也谈过,所以细节部分譬如为什么要取宽度位8倍数等等就略过。重点是要把数组Bits交给谁。恩,glBitmap函数道出了一切。

OpenGL里除了几何对象(点、线、多边形)和纹理图像对象外,还有一种不常用的对象,位图Bitmap。一般来说这样的位图是灰度的,也就是位图矩块内每个像素只有1BIT的信息——

0 OR 1。这对文字来说正好,因为文字就是黑色(/透明)背景中的白色部分,黑白分明。颜色

可以在绘制位图后用glColor设置嘛。glBitmap函数就是用来根据数据显示位图的。而该位图内可以说是被打印了GDI文字上去(用TextOut),于是最后在屏幕上的还是位图文字,且可以用glWindowPos2i调节起始点位置。就这样,完成的GDI文字从基于DC的GDI环境,显示到基于RC的OPenGL环境上。可喜可贺。

具体应用:

1.

2.//CMAINFRAME

3.MyFont mFont;

4.

5.//初始化:

6.mFont.BuildGDIFont("宋体", FW_NORMAL, 25);

7.//25是字体字高,控制字体大小;FW_NORMAL常态重的字体

8.

9.//渲染阶段(RenderGLScene)

10.

11.mFont.PrintGDIText(840, 675, "抖动波演示[D]");

12.

13.//将在坐标X = 840, Y =675位置开始绘制文字。对1024*768大小的渲染窗口中,

14.//即在右上角偏下

OpenGL一个简单的例子

先编译运行一个简单的例子,这样我们可以有一个直观的印象。从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。 例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。

图一:一个彩色的三角形首先创建工程,其步骤如下:

1)创建一个Win32 Console Application。 2)链接OpenGL libraries。在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib 3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。最后单击OK。 现在你可以把下面的例子拷贝到工程中去,编译运行。你可以看到一个彩色的三角形。 我们先看看main函数。函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。 ·glutInit用来初始化GLUT库并同窗口系统对话协商。 ·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。 ·glutInitWindowSize初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。 ·glutInitWindowPosition设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。 ·glutCreateWindow创建顶层窗口,窗口的名字为扩号中的参数。 ·background() 这是自己写的函数,设置背景。其实这个函数中的语句可以写在display 函数中,但为了使功能块更加清晰,所以把背景这一部分单独提出来。 ·glutReshapeFunc注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。在此例中就是myReshape指定形状变化函数。 ·glutDisplayFunc注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。 ·glutMainLoop进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc,glutDisplayFunc。

OpenGL入门学习之七——使用光照来表现立体感

OpenGL入门学习之七——使用光照来表现立体感 2009-01-07 11:49 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 图1 OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

MHDD使用方法以及图文教程

MHDD使用方法以及图文教程(附带MHDD4.6光盘版和DOS版下载) MHDD软件简介 MHDD 是一款由俄罗斯人所开发的免费硬盘实体扫描维护程序,比起一般的硬盘表层扫描,MHDD 有相当令人激赏的扫描速度,让使用者不再需要花费数个小时来除错,只需几十分钟,一颗 80G 大小的硬盘就可以扫瞄完成,且 MHDD 还能够帮使用者修复坏轨,让使用者能够继续延续该硬盘的生命余光。此外, MHDD 还能够对硬盘进行低阶清除的动作,让想要卖掉硬盘的你不必担心硬盘中的数据被接手的买家回复盗用的困扰喔!官方所提供的 MHDD 可分为磁盘版与光盘版两种,如果使用者需要光盘版的话,要用刻录机烧录成光盘后使用。 简洁教程:(MHDD详细图文教程地址 https://www.wendangku.net/doc/243196979.html,/thread-1161-1-1.html) 1、进入MHDD后,按shift+F3扫描端口上的硬盘,制作的这个光盘版启动后自动扫描硬盘; 2、选择要检测硬盘的对应序号并回车; 3、按一下F4进入扫描设置,再按一下F4开始扫描。默认的只是扫描不修复. 4、扫描完毕之后,在/MHDD/LOG下有个MHDD.LOG,是扫描生成的日志文件。在光盘里,已经集成https://www.wendangku.net/doc/243196979.html,在/MHDD目录里面,可以输入EDIT打开文本编辑器,然后定位到/MHDD/LOG/MHDD.LOG,查看扫描结果,并采取下一步措施; 5、如果在按下F4没有反应的时候,可以从新光盘启动,运行一次/MHDD目录下的FBDISK,按ESC退出返回到DOS再输入MHDD,启动MHDD 4.6,这时候MHDD就能正常扫描了,这应该是软件的一个BUG; 6、在MHDD里输入man en all可以查看详细的帮助,输入help只是简短的帮助。《MHDD》工具使用详解与命令解释 1、MHDD是俄罗斯Maysoft公司出品的专业硬盘工具软件,具有很多其他硬盘工具软件所无法比拟的强大功能。 2、MHDD无论以CHS还是以LBA模式,都可以访问到128G的超大容量硬盘(可访问的扇区范围从512到137438953472),即使你用的是286电脑,无需BIOS支持,也无需任何中断支持; 3、MHDD最好在纯DOS环境下运行;中国硬盘基地网 https://www.wendangku.net/doc/243196979.html, 4、MHDD可以不依赖于主板BIOS直接访问IDE口,但要注意不要使用原装Intel品牌主板; 5、不要在要检测的硬盘中运行MHDD;中国硬盘基地网 https://www.wendangku.net/doc/243196979.html, 6、MDD在运行时需要记录数据,因此不能在被写保护了的存储设备中运行(比如写保护的软盘、光盘等); MHDD命令详解 EXIT(热键Alt+X):退出到DOS。 ID:硬盘检测,包括硬盘容量、磁头数、扇区数、SN序列号、Firmware固件版本号、LBA 数值、支持的DMA级别、是否支持HPA、是否支持AAM、SMART开关状态、安全模式级别及

OpenGL编程指南

? ? OpenGL基础图形编程- 总目录 出处:中国游戏开发者 [ 2001-09-20 ] 作者: 总目录 第一章OpenGL与三维图形世界 1.1 OpenGL使人们进入三维图形世界 1.2 OpenGL提供直观的三维图形开发环境 1.3 OpenGL称为目前三维图形开发标准 第二章OpenGL概念建立 2.1 OpenGL基本理解 2.2 OpenGL工作流程 2.3 OpenGL图形操作步骤 第三章Windows NT环境下的OpenGL 3.1 Windows NT下的OpenGL函数 3.2 OpenGL基本功能 3.3 Windows NT下OpenGL结构 第四章OpenGL基本程序结构 第五章OpenGL数据类型和函数名 第六章OpenGL辅助库的基本使用 6.1 辅助库函数分类 6.2 辅助库应用示例 第七章OpenGL建模 7.1 描述图元 7.1.1 齐次坐标

7.1.2 点 7.1.3 线 7.1.4 多边形 7.2 绘制图元 7.2.1 定义顶点 7.2.2 构造几何图元 第八章OpenGL变换 8.1 从三维空间到二维平面 8.1.1 相机模拟 8.1.2 三维图形显示流程 8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视投影 8.4 裁剪变换 8.5 视口变换 8.6 堆栈操作 第九章OpenGL颜色 9.1 计算机颜色 9.1.1 颜色生成原理 9.1.2 RGB色立体 9.2 颜色模式 9.2.1 RGBA模式 9.2.2 颜色表模式 9.2.3 两种模式应用场合 9.3 颜色应用举例 第十章OpenGL光照 10.1 真实感图形基本概念 10.2 光照模型 10.2.1 简单光照模型 10.2.2 OpenGL光组成 10.2.3 创建光源 10.2.4 启动光照 10.3 明暗处理 10.4 材质

详解Qt写OpenGL入门示例

详解 Qt 写 OpenGL 入门示例 2011-07-01 17:12 佚名互联网字号: | 本文介绍的是详解 Qt 写 OpenGL 入门示例,不多说,先来看详细内容。 AD: Qt 写OpenGL 入门示例是本文所介绍的内容。其实我个人是很喜欢玩游戏的,为什么呢?只是因为我还无法制作游戏.所以,以前就看过一些...东西. 比如directx/opengl. 可惜无法入门,而当年拼命的记忆那个windows api版的hello world(vc++自动生成)...在一个星期后便忘记了.使得我对上的编程充满了阴影(在若干年后,我终于明白你不需要去记忆具体api, 因为环境会给你提示) - 都没入门, 怎么开始directx哦?(不过无数次的hello world,也有好处,就是让我明白了windows平台的消息循环机制...这让我在若干年后在看到qt 的()时,心有灵犀的想, 哦,进入了消息循环了...) 后来自然就看看qt,看看c++、PHP就不说了,一直搞这个的)等. 还有有比如SDL一类的搞搞,但始终不得其门而入,qt有自带的提供给opengl的窗口类的. 在我以前, 反正也试过,这样那样的错误就放弃了... 不过不知道为什么, 现在却很简单,(可能做任何事情都有简单和难的时候,只是未到时间吧).,假如你也想玩玩qt? opengl的话, 那么先具体下面一些东西: (1)OpenGL编程指南 (书, 里面有代码的,咋们参考一些) (2)装了qt库和环境(windows下qt里应该有自带opengl, 所以opengl的库就不提了) (3)编译器 那么我们就开始了...反正是很简单的入门...写个, 如下 1.yarco@coto?~/Documents/test/1?$?cat? ? 2.#include?? 3.#include?"" ? 1.int?main(int?argc,?char*?argv[])?. ? 2.yarco@coto?~/Documents/test/1?$?cat? ? 3.#include?"" ? 4.void?MyWidget::initializeGL() ? 5.{ ? 6.} ? 7.void?MyWidget::resizeGL(int?w,?int?h) ? 8.{ ? 9.} ? 10.void?MyWidget::paintGL() ? 11.{ ? 12.????????renderText(20,?100,?"Hello,?My?first?OpenGL?app."); ? 13.} ? .(不详细描述)

_OpenGL入门教程

OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.wendangku.net/doc/243196979.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.wendangku.net/doc/243196979.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.wendangku.net/doc/243196979.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

GHOST使用教程(图解

GHOST使用教程(图解)人人都可“拥有”4GHz的CPU **** 本内容跟帖回复才可浏览***** 河北的刘宗元朋友打电话告诉董师傅,他在查看朋友电脑的系统属性时,发现系统属性里显示这台电脑采用的是Intel的4GHz的P4 CPU(图1)。他很是好奇,要知道去年因4GHz P4 CPU难产,Intel的首席执行官贝瑞特曾当众下跪祈求原谅。 董师傅自然也不相信Intel真的出了4GHz的P4 CPU,不过对这个显示结果还是非常感兴趣,经过一番摸索,发现只要略施小计,我们每一个人都可以“拥有”4GHz的P4 CPU。你也想有这样一颗“心”?别着急,且听师傅慢慢道来。 都是sysdm.cpl文件“惹的祸” 知道了问题的关键,下面要做的就是修改信息了。 首先将C:WindowsSystem32文件夹下的sysdm.cpl文件复制一份出来,然后用资源编辑工具EXESCOPE打开复制出的sysdm.cpl文件,展开“资源→对话框→101”分支。在右侧一共有9个“Link Window”。除了第4、5个外,把另外七个的“可见”属性去掉(即去掉右侧“可见”前的钩),目的是在检测系统属性时只显示第4、5个的内容。 选中第4个“Link window”,在“标题”栏输入文字“Intel(R) Pentium4(R)处理器”;在第5个“Link window”的“标题”栏中输入“4 GHz,2048 MB 的内存”等信息(连内存信息也一并改了。数字可随意输入,但不可过长,否则显示效果较别扭);再将第4个“Link window”的“Y”坐标值改为“149”,将第5个的调整为“170”,以占据原来第1、2个“Link Window”的位置。 修改好后保存该文件,接下来只要用该文件替换原始文件即可。不过,在替换过程中,董师傅又遇到了一个新问题: 文件保护功能会“作祟” 董师傅使用的是Windows XP+SP2系统,要把修改后的sysdm.cpl文件复制到C:WindowsSystem32中替换原文件有些麻烦——SP2强大的文件保护功能会自动还原原始文件。 师傅我并不想禁用文件保护功能,所以借助文件替换工具Replacer解决了这个问题。 将下载回来的文件解压到任一文件夹,双击“replace.cmd”出现命令提示符窗口,将 C:WindowsSystem32sysdm.cpl文件拖到其中,回车;再将修改过的sysdm.cpl文件拖入其中并回车,输入“Y”后按回车,这样就能替换掉系统文件了(在弹出的Windows文件保护时请点“取消”)。 至此,董师傅所想要的4GHz的P4 CPU终于“出现”!心动了吧?那就赶快动手吧。 以上软件下面有得下载 资源编辑工具EXESCOPE 文件替换工具Replacer 一、什么是Ghost? Ghost(幽灵)软件是美国赛门铁克公司推出的一款出色的硬盘备份还原工具,可以实现FAT16、FAT32、NTFS、OS2等多种硬盘分区格式的分区及硬盘的备份还原。俗称克隆软件。 1、特点:既然称之为克隆软件,说明其Ghost的备份还原是以硬盘的扇区为单位进行的,也就是说可以将一个硬盘上的物理信息完整复制,而不仅仅是数据的简单复制;克隆人只能克隆躯体,但这个Ghost却能克隆系统中所有的东东,包

06-OpenGL字体显示

OpenGL 字体显示 在OpenGL中,提供了预定义的字库,可以满足一般的需求,用户也可以自定义字库,OpenGL红宝书中有自定义字库的详细过程。OpenGL预定义字库中提供了位图字符和矢量字符两种显示方式 V oid glutBitmapCharacter(void *font,int character); //位图字符 其中font是GLUT常量,指定点阵字库,如: GLUT_BITMAP_8_BY_13,GLUT_BITMAP_9_BY_15, V oid glutStrokeCharacter(void *font,int character); //矢量字符 Font 的取值有glut_stroke_roman 等间距Roman Simplex 字体,glut_stroke_mono_roman 单一间距Roman Simplex 字体。 本例演示了矢量字符的两种间距以及24磅位图字符的显示。 显示效果: 代码: #include #include #include int width = 200,height = 100; void init(){ glClearColor(0,0,0,0); } void Reshape(int w,int h){ width=w; height=h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluOrtho2D(0.0,width,0.0,height); } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,1.0f,0.0f); glLineWidth(2.0); //设置笔画的大小 glTranslatef(0,250,0); //设置字符显示的位置,否则贴底显示不能完全显示部分字符 glutStrokeCharacter(GLUT_STROKE_ROMAN,79); //输出字体为 GLUT_STROKE_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_ROMAN,112); glutStrokeCharacter(GLUT_STROKE_ROMAN,101); glutStrokeCharacter(GLUT_STROKE_ROMAN,110); glutStrokeCharacter(GLUT_STROKE_ROMAN,71); glutStrokeCharacter(GLUT_STROKE_ROMAN,76); glTranslatef(-460,-150,0); //调整下一行显示的位置 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,79); //输出字体为 GLUT_STROKE_MONO_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,112); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,101); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,110); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,71); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,76); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); //显示24磅的times Roman 点阵字体 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'p'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'e'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'n'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'G'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'L'); glutSwapBuffers(); } int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); glutInitWindowSize( 650, 400 ); glutInitWindowPosition( 100,100 ); glutCreateWindow("show OpenGL"); //′°?ú???a"rectangle" init(); glutDisplayFunc(display); glutReshapeFunc(Reshape);

OpenGL学习入门之VS2010环境配置

OpenGL学习入门之VS2010环境配置OpenGL开发环境简介 基于OpenGL标准开发的应用程序运行时需有动态链接库OpenGL32.DLL、Glu32.DLL,这两个文件在安装Windows NT时已自动装载到C:\WINDOWS\SYSTEM32目录下(这里假定用户将Windows NT安装在C盘上)。OpenGL的图形库函数封装在动态链接库OpenGL32.DLL中,开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。OpenGL 函数命令方式十分有规律,每个库函数均有前缀gl、glu、aux,分别表示该函数属于OpenGL 基本库、实用库或辅助库。Windows NT下的OpenGL包含了100多个核心函数,均以gl 作为前缀,同时还支持另外四类函数: OpenGL实用库函数:43个,以glu作为前缀; OpenGL辅助库函数:31个,以aux作为前缀; Windows专用库函数(WGL):6个,以wgl作为前缀; Win32API函数(WGL):5个,无前缀。 安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.wendangku.net/doc/243196979.html,/resources/libraries/glut/glutdlls37beta.zip VS环境配置 将下载的压缩包解开,将得到5个文件(glut.dll, glut32.dll, glut.lib, glut32.lib,glut.h)

(1)把glut.h复制到x:\Program Files\Microsoft\Visual Studio 10.0\VC\include\GL文件夹中,如果没有GL这个文件夹则可以自己新建一个。(x是你安装VS的盘符号)(2)把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(即与include并排的lib文件夹下)。 (3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32) (注:如在开发应用程序时用到OpenGL辅助库函数,则还需下载相应动态链接库,包含glaux.dll, glaux.lib, glaux.h,相应步骤同上) 第一个OpenGL程序 首先创建工程,其步骤如下: (1)创建一个Win32 Console Application。 (2)链接OpenGL libraries。在Visual C++中先单击Projec / Settings,找到Link标签,最后在Object/library modules 中加上OpenGL32.lib;GLu32.lib;glut.lib;glut32.lib 。 (3)单击Project / Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE 改为__WINDOWS。 (4)单击Project / Settings中的General标签,将Character Set属性值改变为Not Set,最后单击OK。 现在你可以把下面的例子拷贝到工程中去,编译运行。你可以看到一个彩色的三角形,如图1所示。

sniffer使用及图解教程

sniffer使用及图解 注:sniffer使用及图解sniffer pro 汉化注册版下载 黑白影院高清免费在线电影聚集网无聚集无生活,聚集网络经典资源下载 sniffer软件的安装还是比较简单的,我们只需要按照常规安装方法进行即可。需要说明的是: 在选择sniffer pro的安装目录时,默认是安装在c:\program files\nai\snifferNT目录中,我们可以通过旁边的Browse按钮修改路径,不过为了更好的使用还是建议各位用默认路径进行安装。 在注册用户时,随便输入注册信息即可,不过EMAIL一定要符合规范,需要带“@”。(如图1) 图1 点击放大 注册诸多数据后我们就来到设置网络连接状况了,一般对于企业用户只要不是通过“代理服务器”上网的都可以选择第一项——direct connection to the internet。(如图2) 图2 接下来才是真正的复制sniffer pro必需文件到本地硬盘,完成所有操作后出现setup complete提示,我们点finish按钮完成安装工作。 由于我们在使用sniffer pro时需要将网卡的监听模式切换为混杂,所以不重新启动计算机是无法实现切换功能的,因此在安装的最后,软件会提示重新启动计算机,我们按照提示操作即可。(如图3) 重新启动计算机后我们可以通过sniffer pro来监测网络中的数据包。我们通过“开始->所有程序->sniffer pro->sniffer”来启动该程序。 第一步:默认情况下sniffer pro会自动选择你的网卡进行监听,不过如果不能自动选择或者本地计算机有多个网卡的话,就需要我们手工指定网卡了。方法是通过软件的file菜单下的select settings来完成。 第二步:在settings窗口中我们选择准备监听的那块网卡,记得要把右下角的“LOG ON”前打上对勾才能生效,最后点“确定”按钮即可。(如图4) 图4 第三步:选择完毕后我们就进入了网卡监听模式,这种模式下将监视本机网卡流量和错误数据包的情况。首先我们能看到的是三个类似汽车仪表的图象,从左到右依次为“Utiliz ation%网络使用率”,“Packets/s 数据包传输率”,“Error/s错误数据情况”。其中红色区域是警戒区域,如果发现有指针到了红色区域我们就该引起一定的重视了,说明网络线路不好或者网络使用压力负荷太大。一般我们浏览网页的情况和我图11中显示的类似,使用率不高,传输情况也是9到30个数据包每秒,错误数基本没有。(如图5) 图5

OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。——https://www.wendangku.net/doc/243196979.html, 一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ]) 本文来源于ZwqXin(https://www.wendangku.net/doc/243196979.html,/), 转载请注明 原文地址:https://www.wendangku.net/doc/243196979.html,/archives/opengl/opengl-font-setting-showing.html 怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。 而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。 三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。其中前两步比较重要,着重讨论讨论哈~ 1. 常规的屏幕字体打印(NormalFont) 应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。 1. /////////一般的英语字体打印 2.void MyFont::BuildGLFont(int fontHeight) 3.{ 4. HDC hDC =::GetDC(HWND_DESKTOP); //////就是这里搞晕了半晚 5. 6. int tFontHeight = -1 * fontHeight; 7. 8. NormalFontBase = glGenLists(96); // Storage For 96 Characters 9. HFONT font = CreateFont( -tFontHeight, // Height Of Font 10. 0, // Width Of Font 11. 0, // Angle Of Escapement 12. 0, // Orientation Angle 13. FW_BOLD, // Font Weight 14. TRUE, // Italic 15. FALSE, // Underline

(完整版)电脑简单使用说明书初学电脑实用教程

认知电脑 电脑的主要设备包括: 显示器 显示器开关,用来打开显示器,通常显示器打开状态下为开关指示灯(位于显示器开关旁边或显示器后方)亮着,显示器关闭状态开关指示灯则为熄灭。 电 脑 显示器 音箱 键盘 鼠标 主机 输出设备 输入设备 显示器开关

主机开关 主机重启开关 电脑主机如上图示主要有2个开关按钮,主机开关(通常为个头较大位于上方的开关按钮)用于作为电脑主机的开关,主机重启按钮(通常为个头较小位于较下方的开关按钮)用于作为电脑出现死机故障无法正常关机或重启的开关按钮,通常也叫短路开关。 键盘 键盘,电脑的重要输入设备之一,用于信息和操作录入的重要输入设备。

鼠标也作为电脑的重要输入设备,如上图所示,通常的鼠标主要有左键,滚动滑轮键, 右键这三个功能键组成。左右键的操作方式主要有:单击,双击,按住不放拖动鼠标等操作。 左键单击的作用:选中、连接、按钮的按入(像我们通常按电视遥控器按钮一样,打开了按钮显示的对应功能)。 左键双击的作用:打开windows 桌面的功能图标对应的功能。 注:通常2次敲击左键的间隔要尽可能小点,要快,否则电脑只认为你是做了2 次左键单击事件(只是对图标进行了2次选中操作),而不认为你是做1次左键双击事件,就不能达到你想要的打开这个功能的操作。如果出现上述的点击不够快的情况,只需重复回一次正确的双击操作就可以打开对应你所点击的图标功能。 右键单击的作用:打开你所点击的地方的高级菜单(高级功能菜单中有对你所点击的地方的大部分功能操作选项,通常有打开、改名即重命名、复制、删除、属性设置等功能)。右键单击弹出高级菜单后,将光标移进高级功能菜单里面,可以看见光标所在的菜单选项背景色改变为蓝色,这时你只要左键单击一下就可以进入这项功能。 注:如果失误右键点击弹出了高级菜单,只需将光标移到空白的地方(没文字,没图标,没按钮的地方)左键单击一次就可以退出并关闭高级菜单。 右键双击的作用:通常不使用右键双击,所以在不做详细介绍。 滚动滑轮的作用:通常文档或网页显示器不能一屏显示完,所以通常有部分在下方,这时我们想看下面的内容,就要将下面的内容拖上来看,这时就要使用滚动滑轮了。 滚轮向下滑动:页面向上拖动可以看到下面的内容。 滚轮向上滑动:页面向下拖动可以看到上面的内容。 左键 右键 滚动滑轮

OpenGL入门学习——第三课 绘制几何图形的一些细节问题

OpenGL入门学习——第三课绘制几何图形的一些细节问题 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处。例如:点太小,难以看清楚;直线也太细,不舒服;或者想画虚线,但不知道方法只能用许多短直线,甚至用点组合而成。 这些问题将在本课中被解决。 下面就点、直线、多边形分别讨论。 1、关于点 点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:void glPointSize(GLfloat size); size必须大于0.0f,默认值为1.0f,单位为“像素”。 注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。 例子: void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.0f); glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.5f); glEnd(); glFlush(); } 2、关于直线 (1)直线可以指定宽度: void glLineWidth(GLfloat width); 其用法跟glPointSize类似。 (2)画虚线。 首先,使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)。 然后,使用glLineStipple来设置虚线的样式。 void glLineStipple(GLint factor, GLushort pattern); pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。 以下是一些例子: https://www.wendangku.net/doc/243196979.html,/upfile/200608/20060801172519.gif 声明:该图片来自https://www.wendangku.net/doc/243196979.html,,该图片是《OpenGL编程指南》一书的附图,由于该书的旧版(第一版,1994年)已经流传于网络,我希望没有触及到版权问题。 示例代码:

GHOST使用教程(图解)

GHOST使用教程(图解) 收集者:小路发布于:https://www.wendangku.net/doc/243196979.html, 发布时间:2007- 5-6 12:50:48 发布人:小路 减小字体增大字体 一、什么是Ghost? Ghost(幽灵)软件是美国赛门铁克公司推出的一款出色的硬盘备份还原工具,可以实现FAT16、FAT32、NTFS、O S2等多种硬盘分区格式的分区及硬盘的备份还原。俗称克隆软件。 1、特点:既然称之为克隆软件,说明其Ghost的备份还原是以硬盘的扇区为单位进行的,也就是说可以将一个硬盘上的物理信息完整复制,而不仅仅是数据的简单复制;克隆人只能克隆躯体,但这个Ghost却能克隆系统中所有的东东,包括声音动画图像,连磁盘碎片都可以帮你复制,比克隆人还厉害哟:)。Ghost支持将分区或硬盘直接备份到一个扩展名为.gho的文件里(赛门铁克把这种文件称为镜像文件),也支持直接备份到另一个分区或硬盘里。 2、运行ghost:至今为止,ghost只支持Dos的运行环境,这不能说不是一种遗憾:(。我们通常把ghost文件复制到启动软盘(U盘)里,也可将其刻录进启动光盘,用启动盘进入Dos环境后,在提示符下输入ghost,回车即可

运行ghost,首先出现的是关于界面,如图 按任意键进入ghost操作界面,出现ghost菜单,主菜单共有4项,从下至上分别为Quit(退出)、Options(选项)、Peer to Peer(点对对,主要用于网络中)、Loca l(本地)。一般情况下我们只用到Local菜单项,其下有三个子项:Disk(硬盘备份与还原)、Partition(磁盘分区备份与还原)、Check(硬盘检测),前两项功能是我们用得最多的,下面的操作讲解就是围绕这两项展开的。 3、由于Ghost在备份还原是按扇区来进行复制,所以在操作时一定要小心,不要把目标盘(分区)弄错了,要不

OpenGL期末复习资料

Windows GUI中的基本绘图工具包括: 画笔、画刷、位图、设备描述环境、调色板、字体OpenGL中的基本图元包括:点、线、三角形、四边形、多边形、位图或图像 OpenGL中基本变换函数为: 平移void glTranslated( GLdouble x, GLdouble y, GLdouble z ); 旋转void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); 缩放void glScaled( GLdouble x, GLdouble y, GLdouble z ); OpenGL中设置颜色的函数为: void glColor3f( GLfloat red, GLfloat green, GLfloat blue ); OpenGL中设置法向量的函数为: void glNormal3i( GLint nx, GLint ny, GLint nz ); OpenGL中的透视投影和平行投影对应的函数分别是:glFrustum(); glOrtho(); OpenGL中各个模式(如灯光的启用或禁止)的启用和禁止的函数为:glEnable( GLenum cap )、glDisable (GLenum cap ); Windows对话框的分类:模态对话框,非模态对话框Windows对话框的控件包括:静态控件、按钮控件、滚动条控件、编辑控件、列表框类、组合框类 MFC框架包含的类有: 应用类、文档类、视图类、框架类 设置当前矩阵为单位矩阵的函数为:glLoadIdentity(void); 的功能是重置当前指定的矩阵为单位矩阵如何在OpenGL中绘制基本图元// glLineWidth(1.0f); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_LINES); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(20.0f,0.0f,0.0f); glEnd(); gluLookAt的作用及该函数各个参数的含义 void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz ); eyex, eyey,eyez 指定视点的位置 centerx,centery,centerz 指定参考点的位置 upx,upy,upz 指定视点向上的方向 glLight()中各个参数的含义 void glLighti ( GLenum light, GLenum pname, GLint param ); 启用的灯光号, 光源光的参数 指向那个光源(灯光号)参数被设置 指向启用的灯光的指针 OpenGL中的光照设置方式 1.指明材质glMaterial()漫反射镜面反射 2.设置灯光glLight(Glenum light,Glenum pname,Glint param) 3.生效glEnable(GL_LIGHTING) 4指明打开的灯 glEnable(GL_LIGHT0) OpenGL中的绘制列表的设置方式 // listName = glGenLists (1); glNewList (listName, GL_COMPILE); Opengl函数(一般绘图函数) glEndList (); 显示glCallList(listName); ); Win32编程中镂空图的绘制方法 1、创建一张单色位图,将单色位图选到兼容设备环境 (dcMask),将原图选入令一设备兼容环境(dc)。 2、将dcMask的背景设为紫色,再将dc绘制到dcMask, 得到蒙板图。 3、设置原图所在dc的前景色为白色,背景色为黑色, 将蒙板图和dc中原图做AND运算,绘制到dc中。 hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); hbmp=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BIT MAP,600,450,LR_LOADFROMFILE); SelectObject(mdc,hbmp); BitBlt(mdc,480,190,100,100,bufdc,100,0,SRCAND); //进行与运算 BitBlt(mdc,480,190,100,100,bufdc,0,0,SRCPAINT); //进行OR运算 ReleaseDC(hWnd,hdc); OpenGL中的透视投影和平行投影对应的函数中参数的 含义 void glFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ); left,right分别指的是左右截面到眼睛(在XY平面上) 的距离 top,bottom分别指的是上下截面到眼睛(在XY平面上) 的距离 zNear, zFar都是相对眼睛的(YZ平面)距离 OpenGL中矩阵堆栈操作的作用 glPushAttrib();glPopAttrib() 矩阵堆栈操作,为重复记录,平移与撤销的操作提供了 一种理想的机制。每次操作只需对当前栈顶矩阵进行操 作即可,glPushAttrib()就相当于记录每一次操作, glPopAttrib()就相当于恢复由glPushAttrib()最新记 录的操作。

相关文档
相关文档 最新文档