OpenGL编程问题解决办法.docx
- 文档编号:29447310
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:53
- 大小:43.55KB
OpenGL编程问题解决办法.docx
《OpenGL编程问题解决办法.docx》由会员分享,可在线阅读,更多相关《OpenGL编程问题解决办法.docx(53页珍藏版)》请在冰豆网上搜索。
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
本来OpenGL程序一般还要包含
然后看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
问题:
怎么用这本书上所提供的源代码?
解决:
很简单,每个源代码都是一个.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)函数中调用的子函数,只要删除一个,把两个合并起来,就没事了,是因为子函数太多造成的。 但是当把窗口最大化时又出现了刚才的问题? 是窗口变化函数不符合要求,还是文字变化没有考虑窗口? 最后证明是刷新函数的问题,还有双缓冲技术问题,只要将刷新都统一起来即可。 另
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 编程 问题解决 办法