OpenGL编程问题解决办法.docx

上传人:b****0 文档编号:17279684 上传时间:2023-07-23 格式:DOCX 页数:53 大小:43.55KB
下载 相关 举报
OpenGL编程问题解决办法.docx_第1页
第1页 / 共53页
OpenGL编程问题解决办法.docx_第2页
第2页 / 共53页
OpenGL编程问题解决办法.docx_第3页
第3页 / 共53页
OpenGL编程问题解决办法.docx_第4页
第4页 / 共53页
OpenGL编程问题解决办法.docx_第5页
第5页 / 共53页
OpenGL编程问题解决办法.docx_第6页
第6页 / 共53页
OpenGL编程问题解决办法.docx_第7页
第7页 / 共53页
OpenGL编程问题解决办法.docx_第8页
第8页 / 共53页
OpenGL编程问题解决办法.docx_第9页
第9页 / 共53页
OpenGL编程问题解决办法.docx_第10页
第10页 / 共53页
OpenGL编程问题解决办法.docx_第11页
第11页 / 共53页
OpenGL编程问题解决办法.docx_第12页
第12页 / 共53页
OpenGL编程问题解决办法.docx_第13页
第13页 / 共53页
OpenGL编程问题解决办法.docx_第14页
第14页 / 共53页
OpenGL编程问题解决办法.docx_第15页
第15页 / 共53页
OpenGL编程问题解决办法.docx_第16页
第16页 / 共53页
OpenGL编程问题解决办法.docx_第17页
第17页 / 共53页
OpenGL编程问题解决办法.docx_第18页
第18页 / 共53页
OpenGL编程问题解决办法.docx_第19页
第19页 / 共53页
OpenGL编程问题解决办法.docx_第20页
第20页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

OpenGL编程问题解决办法.docx

《OpenGL编程问题解决办法.docx》由会员分享,可在线阅读,更多相关《OpenGL编程问题解决办法.docx(53页珍藏版)》请在冰点文库上搜索。

OpenGL编程问题解决办法.docx

OpenGL编程问题解决办法

问题:

VS2008与VC6.0和OPENGL的差别?

解决:

VS2008比VC6.0高级,更新多,所编程序不能互相运行,包括使用OPENGL的路径跟命令语句也不一样,否则VS2008会出现无数意想不到,很难解决的错误。

问题:

VS2008创建OPENGL工程的程序与VC6.0的不一样?

解决:

分别见《OPENGL三维图形系统开发与实用技术(清华大学出版社)》《OPENGL超级宝典第4版》(VC6.0)与《OPENGL超级宝典第5版(英文)》(VS2008)。

问题:

VS2008中有些GL辅助库是没有的?

解决:

可以在VC6.0相应目录中拷贝过去,也可以再网上下载OPENGL辅助库。

包括.h文件、.lib文件、.dll文件,分别放在MicrosoftVisualStudio\VC98\include\GL里、MicrosoftVisualStudio\VC98\lib里、C:

\windows\system32里。

都有这些:

glut32.dll;glut32.lib;glut.dll;glut.h;glut.lib;opengl32.dll;gl.hglu.hglaux.h;opengl32.libglaux.libglu32.lib等。

问题:

VS2008中调用OPENGL的后来辅助开发的库时把.h文件复制到相应目录还是找不到比如#include“glee.h”?

解决:

不用复制到那个专门文件夹,在语言中指明该.h文件的路径即可,注意不要出现中文,比如#include“D:

\study\OPENGL\shared\glee.h”。

问题:

VC6.0中编译那个console程序画球时总是找不到sonsole.pch文件?

解决:

快捷键alt+f7,也可以工程>设置>C/C++>分类选为预编译的头文件,然后选择下面的不使用预补偿页眉,就可以了。

问题:

VC6.0中打开什么文件就把整个工作台打开?

解决:

打开.dsw文件即可。

在.cpp文件中编写程序。

问题:

使用前的准备,导入glut?

解决:

OpenGL官方网站(英文)http:

//www.opengl.org

下面我将对Windows下的OpenGL编程进行简单介绍。

第一步:

选择一个编译环境   

现在Windows系统的主流编译环境有VisualStudio,BrolandC++Builder,Dev-C++等,它们都是支持OpenGL的。

但这里我们选择VC++6.0作为学习OpenGL的环境。

   

第二步:

安装GLUT工具包   

GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。

   

Windows环境下的GLUT下载地址:

(大小约为150k)   

http:

//www.opengl.org/resources/libraries/glut/glutdlls37beta.zip  

无法从以上地址下载的话请使用下面的连接:

   

    

Windows环境下安装GLUT的步骤:

   

1、将下载的压缩包解开,将得到5个文件

2、以我的安装目录为例:

   

(1)“d:

\ProgramFiles\MicrosoftVisualStudio\VC98\include\GL文件夹”。

把解压得到的glut.h放到这个GL文件夹里。

没有GL文件夹可以自己建一个,一般都有的。

(2)“d:

\ProgramFiles\MicrosoftVisualStudio\VC98\lib文件夹”。

把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹。

(3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。

(典型的位置为:

C:

\Windows\System32)这是非常重要的动态链接库设置!

 

第三步,创建工程,其步骤如下:

   

(1)创建一个Win32ConsoleApplication。

(以我创建的为例,工程名为simpleGL)   

(2)链接OpenGLlibraries:

在VisualC++中先单击Project,再单击Settings,再找到Link单击,最后在Object/librarymodules的最前面加上opengl32.libGlut32.libGlaux.libglu32.lib。

   

(3)单击ProjectSettings中的C/C++标签,分类选为预编译的头文件,然后选择下面的不使用预补偿页眉。

最后单击OK。

  

VS2008为:

.配置环境

先创建一个Win32控制台应用程序项目(文件——新建——项目——win32),配置项目属性:

(1)项目——项目属性——配置属性——C/C++——预处理器——预处理器定义,添加

GLUT_BUILDING_LIB(直接复制到输入框)

(2)项目——项目属性——配置属性——链接器——输入——附加依赖项,添加

glut32.libOpengl32.libGlu32.lib(直接复制到输入框)

现在,准备工作基本上完成了,可不要轻视这一步,如果你没有设置好在编译及运行过程中总会出错的。

对于VS2005可以如下设置:

1、把glut.h复制到VC安装路径下的PlatFormSDK\include\gl文件夹

2、把glut32.lib复制到VC安装路径下的PlatFormSDK\lib文件夹

3、把glut32.dll复制到Windows\System32文件夹

4、在VC中创建控制台应用程序,在选项中清除“使用预编译头”(以免影响可移植性)

5、在VC中打开项目->属性对话框进行如下设置:

       将“配置”下拉框选则为“所有配置”

       打开“链接器--输入”项

       在“附加依赖项”中增加:

       OpenGL32.lib

       glu32.lib

       glut32.lib

第四步,创建一个最简单的opengl程序

#include

voidmyDisplay(void)

{

   glClear(GL_COLOR_BUFFER_BIT);

   glRectf(-0.5f,-0.5f,0.5f,0.5f);

   glFlush();

}

intmain(intargc,char*argv[])

{

   glutInit(&argc,argv);

   glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

   glutInitWindowPosition(100,100);

   glutInitWindowSize(400,400);

   glutCreateWindow("第一个OpenGL程序");

   glutDisplayFunc(&myDisplay);

   glutMainLoop();

   return0;

}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形。

下面对各行语句进行说明。

首先,需要包含头文件#include,这是GLUT的头文件。

本来OpenGL程序一般还要包含,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。

然后看main函数。

intmain(intargc,char*argv[]),这个是带命令行参数的main函数,各位应该见过吧?

没见过的同志们请多翻翻书,等弄明白了再往下看。

注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。

这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。

1、glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。

其格式比较死板,一般照抄这句glutInit(&argc,argv)就可以了。

2、glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。

GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。

更多信息,请自己Google。

当然以后的教程也会有一些讲解。

3、glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。

4、glutInitWindowSize,这个也简单,设置窗口的大小。

5、glutCreateWindow,根据前面设置的信息创建窗口。

参数将被作为窗口的标题。

注意:

窗口被创建后,并不立即显示到屏幕上。

需要调用glutMainLoop才能看到窗口。

6、glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。

(这个说法不够准确,但准确的说法可能初学者不太好理解,暂时这样说吧)。

7、glutMainLoop,进行一个消息循环。

(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。

在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay函数”。

于是myDisplay函数就用来画图。

观察myDisplay中的三个函数调用,发现它们都以gl开头。

这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍。

1、glClear,清除。

GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。

2、glRectf,画一个矩形。

四个参数分别表示了位于对角线上的两个点的横、纵坐标。

3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。

其作用跟fflush(stdout)类似。

问题:

VC6.0中用OPENGL超级宝典中提供的gltools.h出错,glee.h中longlong格式不对,freeglut.h也出错?

解决:

将gltools.h换成之前的glut.h就对了,glee.h中那个是因为编译器版本太低,不识别。

后面不清楚。

这个问题可以这样解决:

将shared文件夹中所有的.h文件复制到GL文件夹中,.lib文件复制到LIB文件夹中,然后将相应头文件对应.cpp文件中的引用格式加一个gl/,然后再运行就不会出错了。

只是有一点,他们定义了很多东西,很容易重定义,所以自己写的程序就稍微改一下,比如将Y1改成Y11即可。

问题:

书中voidmain(void)是无效语言?

解决:

删掉程序就正常了。

问题:

最后确定怎么用?

解决:

用VS2008的建工程,头文件就先用glut.h,这个现在是够用的。

问题:

在画直线时遇到运行失败,没有错误,但是显示窗口是白的?

解决:

把那个之前使用的ChangeSize函数换成第三章新用的ChangeSize函数就好了,某些定义不一样。

并且那段画直线的程序放在函数RenderScene下即可。

大框架都是一样的,直接复制粘贴就好。

问题:

就是在运行书上画螺旋点的程序时,出现xRot,yRot没定义。

还有sin,cos未知?

解决:

后一个问题直接加一个#include即可解决,但是xRot还是不知道怎么回事,后来运用书上代的源代码复制到自己建立的工程中去,就没问题了,它在其中就有相应的定义。

问题:

怎么用这本书上所提供的源代码?

解决:

很简单,每个源代码都是一个.cpp文件,只要重新新建一个工程,然后将.cpp文件编辑打开,全部复制粘贴到新工程上就可以了,有时候会自己加一些头文件,比如#include“matn.h”等等。

还有必须改得是“…/…/gltools.h”改成“gl/glut.h”即可。

问题:

怎么用OPENGL画圆弧?

解决:

这个暂时知道的只能是用许多的点或直线逼近近似曲线,最好不用点。

问题:

怎么找OPENGL的RGB配色方案?

解决:

打开画图板,画图板里的颜色所对应的RGB数值除以225就是OPENGL里的那个值。

问题:

多边形的实心或空心?

解决:

用画直线的画法画的是空心的多边形,只有线条,但是用多边形自带的函数,比如三角形、矩形的函数画出来的就是实心多边形。

问题:

怎么让所画刻度线循环动起来?

解决:

用glutTimerFunc(,,)函数就可以了,第一个数就是运动间隔时间,变换大小可以变动其运动速度。

建立两个数组,一个用画刻度线,一个用来让其动起来,后者要比前者多+1,不然程序会崩溃,我也不知道是为什么。

分别用两个循环,一个用来画刻度线,一个用来让每个刻度线跑起来。

还有一种方法:

voidtimeTick(void)

{

if(ys>50.0)ys=-10.0f;

ys=ys+0.01f;

glutPostRedisplay();

}

然后调用:

glutIdleFunc(timeTick);即可.

问题:

怎么用OPENGL加文字?

解决:

voidglutBitmapCharacter(void*font,intcharacter);绘制一个图像字符

intglutBitmapWidth(void*font,intcharacter);返回一个图像字符的宽度参数:

font:

要使用的图像字体,如下表所示:

GLUT_BITMAP_8_BY_13:

一种固定宽度字体,每个字符都放在一个8x13像素的矩形框内

GLUT_BITMAP_9_BY_15:

一种固定宽度字体,每个字符都放在一个9x15像素的矩形框内

GLUT_BITMAP_TIMES_ROMAN_10:

一种10点均匀间距的TimesRoman字体

GLUT_BITMAP_TIMES_ROMAN_24:

一种24点均匀间距的TimesRoman字体

GLUT_BITMAP_HELVETICA_10:

一种10点均匀间距的Helvetica字体

GLUT_BITMAP_HELVETICA_12:

一种12点均匀间距的Helvetica字体

GLUT_BITMAP_HELVETICA_18:

一种18点均匀间距的Helvetica字体character:

绘制的字符的ASCII码.

intglutBitmapLength(void*font,constunsignedchar*string);获取一个图像字符串的宽度.参数:

font:

同上.

string:

想要测量宽度的字符串.

voidglutStrokeCharacter(void*font,intcharacter);绘制一个图形字符

intglutStrokeWidth(void*font,intcharacter);返回一个图形字体的宽度参数:

font:

要使用的图形字体,如下表所示:

GLUT_STROKE_ROMAN一种等间距的RomanSimplex字体,仅包括32到127的ASCII字符

GLUT_STROKE_MONO_ROMAN一种单一间距的RomanSimplex字体,仅包括32到127的ASCII字符

Character:

绘制的字符的ASCII码.

intglutStrokeLength(void*font,constunsignedchar*string);获取一个图形字符串的宽度参数:

font:

同上.

string:

想要测量宽度的字符串.

问题:

怎么用gluLookAt函数?

解决:

gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);

1、改变前三个参数的值可以模拟人在实际环境中的移动;

2、改变中间三个参数的值,可以模拟人眼的转动,即所观察场景的变化。

3、后三个参数的值比较特殊,它所制定的不是一个点,而是一个方向,即决定将哪一个坐标轴作为向上的方向,如果向上方向与观察点到中心点的方向一致,结果将是不确定的。

问题:

怎么用gluPerspective函数?

解决:

这个函数原型为:

voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);

  创建一个对称的透视型视景体,但它的参数定义于前面的不同,如图。

其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。

参数fovy定义视野在Y-Z平面的角度,范围是[0.0,180.0];参数aspect是投影平面宽度与高度的比率;参数Near和Far分别是近远裁剪面到视点(沿Z负轴)的距离,它们总为正值。

问题:

读懂一个显示text程序?

解决:

这是一个完整程序,可以直接运行。

#include"stdafx.h"

#include

#include

#include

#include

#include

usingnamespacestd;

GLfloatUpwardsScrollVelocity=-10.0;

floatview=20.0;//只与动起来有关

charquote[6][80];

intnumberOfQuotes=0,i;

voidtimeTick(void)//就是让字动起来中的,UpwardsScrollVelocity有大到小的变化

{

if(UpwardsScrollVelocity<-600)//view是辅助的,可以不用,去掉也没问题

view-=0.000011;

if(view<0){view=20;UpwardsScrollVelocity=-10.0;}

//exit(0);

UpwardsScrollVelocity-=0.015;

glutPostRedisplay();

}

voidprintToConsoleWindow()

{

intl,lenghOfQuote,i;

for(l=0;l

{

lenghOfQuote=(int)strlen(quote[l]);

for(i=0;i

{

cout<

}

cout<

}

}

voidRenderToDisplay()

{

intl,lenghOfQuote,i;

glTranslatef(0.0,0.0,UpwardsScrollVelocity);//3D平移一个向量,-100是开始时y上-100,UpwardsScrollVelocity是让其在z轴上平移

glRotatef(-20,1.0,0.0,0.0);//绕x轴旋转-20度

glScalef(0.1,0.1,0.1);//缩放字的大小

for(l=0;l

{

lenghOfQuote=(int)strlen(quote[l]);

glPushMatrix();

glTranslatef(-(lenghOfQuote*37),-(l*200),0.0);//第一个是将句子左右居中,第二个是将每句话都隔开,不然就叠加到一起了

for(i=0;i

{

glColor3f((UpwardsScrollVelocity/10)+300+(l*10),(UpwardsScrollVelocity/10)+300+(l*10),0.0);//是为了让字母显示黄色,也可以不用这些参数自己配色

glutStrokeCharacter(GLUT_STROKE_ROMAN,quote[l][i]);//画出图形字符,第一个是字体,第二个是字符

}

glPopMatrix();

}

}

voidmyDisplayFunction(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();//用单位矩阵替代当前矩阵

gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0,0.0,1.0,0.0);//视角的改变

RenderToDisplay();

glutSwapBuffers();

}

voidreshape(intw,inth)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0,1.0,1.0,3200);

glMatrixMode(GL_MODELVIEW);

}

intmain()

{

strcpy(quote[0],"Luke,Iamyourfather!

.");

strcpy(quote[1],"Obi-Wanhastaughtyouwell.");

strcpy(quote[2],"Theforceisstrongwiththisone.");

strcpy(quote[3],"Alertallcommands.Calculateeverypossibledestinationalongtheirlastknowntrajectory.");

strcpy(quote[4],"5323");

numberOfQuotes=5;

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

glutInitWindowSize(800,400);

glutCreateWindow("StarWarsscroller");

glClearColor(0.0,0.0,0.0,1.0);

glLineWidth(3);

glutDisplayFunc(myDisplayFunction);

glutReshapeFunc(reshape);

glutIdleFunc(timeTick);

glutMainLoop();

return0;

}

问题:

让text文本跟着刻度线一起动?

解决:

只要在其移动的y轴上加上与刻度线相应的移动变量即可。

问题:

在显示所有时,就是加上文字显示后,就会出问题,显示就乱了?

解决:

主要是因为RenderScene(void)函数中调用的子函数,只要删除一个,把两个合并起来,就没事了,是因为子函数太多造成的。

但是当把窗口最大化时又出现了刚才的问题?

是窗口变化函数不符合要求,还是文字变化没有考虑窗口?

最后证明是刷新函数的问题,还有双缓冲技术问题,只要将刷新都统一起来即可。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2