OpenGL编程低级错误+常见问题简答
1. 没有glDisable(GL_TEXTURE_2D),导致基本⼏何作图全部失败。
2. 镜头位置没调好,导致所有物体不可见.
3. 物体位置数据错误,导致物体⼤⼤超出镜头显⽰范围.
4. 纹理没有GL_CLAMP导致边界拼接出现缝线.
5. 纹理没有GL_REPEAT导致使⽤超出1.0纹理坐标技巧失败,显⽰单⾊插值.
6. 没有glEnable(GL_TEXTURE_2D)导致全⽩纹理.
7. glEnable(GL_TEXTURE_2D)后没有使⽤纹理顶点导致如glColor效果的纯单⾊.
8. 应该在作图循环设置灯光位置,因为The position is transformed by the modelview matrix when glLight is called (just as if it were a point), and it is stored in eye coordinates.
9. 灯光位置应该是4个float,3个float程序不出错,但结果完全扭曲。
10. 打开灯光却没设置顶点法线,到头⼀场空。
11. Window Class没有CS_OWNDC,导致glDrawPixels失败,如在⼦窗⼝View上进⾏象素写⼊操作.
12. 没有设置PIXELFORMATDESCRIPTOR的cAlphaBits,导致glReadPixels读取alpha通道数据失败,统统为0.
13. ⼿动实现的多层纹理闪烁,出现线带,没有使⽤glPolygonOffset.
14. glDrawPixels格式GL_RGB或GL_BGR_EXT的数据时崩溃,且数据有效,没有使⽤glPixelStorei(GL_UNPACK_ALIGNMENT, 1);导致图像⾏默认4字节对齐,导致OpenGL数据读取越界崩溃.相应的要为glReadPixels设置glPixelStorei(GL_PACK_ALIGNMENT, 1);
15. glReadPixel读取被覆盖的OpenGL窗⼝部分的图像数据时,读出数据混乱⽆效,OpenGL Pixel Ownership检测导致,标准如此.使⽤PixelBuffer,或强制置前OpenGL窗⼝解决.
16. glReadPixels读取总是从FrameBuffer的左下往右上读取,毫⽆参数可设置改变⽅向,真是笨到家了. 载⼊图像⼀般还是从上到下⽐较容易理解.
17.使⽤glDepthMask(GL_FALSE)后不打开,glClear⽆法清除深度缓冲,导致现象:场景起始静⽌正常,⼀旦移动出现不规则的透明⽆渲染区域,深度缓存逻辑混乱.
18. gluPerspective(45.0f, (GLfloat)cxPixels/(GLfloat)cyPixels, 0.1f, 2000.0f);这⾥的0.1f将导致物体和地⾯的相交处闪烁,原因待查,⾄少取1.0f.
19. 没有显⽰定义shiniess或shiniess为0,在shader中对gl_FrontMaterial.shininess使⽤pow计算,结果不可测,⿊⾊条带闪烁,quite not understand.
20. 纹理出现⽩⾊点状闪烁,没有Mipmap过滤导致!
21. 任何初装的Windows系统,多好的机器,⼀开始对OpenGL只⽀持1.1,连多重纹理都没有,需要警惕这种机器,装着DX9,微软真恶⼼,::SwapBuffer直接崩溃,故需要检测显卡⾄少⽀持了1.2标准,否则要求更新显卡驱动程序.
22. 3D和2D,透视和正射模式混合时,2D模式的渲染覆盖不了3D的渲染,原因深度测试失败,
a.2D下渲染时所取点深度确实⼤于3D点的深度.
b.glOrtho参数错误,导致2D渲染所得深度值错误,如zNear被取负数!
c.使⽤glDisable(GL_DEPTH_TEST);
23. glDrawElements崩溃,
a.glXXXPointer设置的缓冲错误,顶点索引越界引⽤顶点数组.
b.当前glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer);硬件缓冲和内存缓冲混淆.
24. 画⾯上出现⽅块形背景⾊,原因,渲染⼀次后,在glClear时glDepthMask没有打开,glClear没能clear掉depth,但clear掉颜⾊缓冲,depth值持续到下⼀次render,导致depth test没通过,颜⾊画不上.
25. 树叶挡在物体前,树叶间隙或蛀洞本应该透明却呈现背景⾊.原因,没有启⽤Alpha过滤.⼀般不可能⽤⼏何形状勾勒出叶⼦的形状,只⽤较⼤的多边形包围叶⼦,⽤Alpha过滤掉空隙.此时不启⽤Alpha过滤,出现Alpha为0的三⾓⾯也被渲染,但得到的是背景图像,并且由于Alpha为0的三⾓⾯离视点近,后⾯的物体渲染⽆法通过深度测试补上透明的空隙区域.
26. atlgdi.h⾥有#pragma comment(lib, "opengl32.lib"),导致⽆源⽆故链接opengl32.lib失败.
问:OpenGL中的Stencil Buffer是什么东西?
答:模板缓存(StencilBuffer)。它可以保持屏幕上某些部位的图形不变,⽽其它部位仍然可以进⾏图形绘制。⽐⽅说,可以通过模板缓存来绘制透过汽车挡风玻璃观看车外景物的画⾯。⾸先,将挡风玻璃的形状存贮到模板缓存中去,然后再绘制整个场景。这样,模板缓存挡住了通过挡风玻璃看不见的任何东西,⽽车内的仪表及其它物品只需绘制⼀次。因此,随着汽车的移动,只有外⾯的场景在不断地更改。
问:glos.h是什么⽂件?
答:判别操作系统的头⽂件。
问:OpenGL的左右缓冲区如何使⽤?即:gldrawbuffer()中的,GL_RIGHT、GL_LEFT参数的使⽤。我想做⼀副⽴体图,(两副图像交替在屏幕上不停刷新)。图形加速卡选⽤的是华硕的3800带⽴体镜的那⼀种。
答:这需要看驱动程序是否⽀持OpenGL的左右缓冲区。据我们所知,华硕显卡不带这样的驱动。⽽象DiamondFire GL系列、ELSA的Glorial系列等显卡⽀持这种功能。在购买显卡时,应认清驱动程序的⽀持性能。
问:请问⽤在OpenGL编程中有哪些⽅法可以得到两个曲⾯的交线?
答:OpenGL⽤于绘制图形,没有交线计算,需要⾃⾏开发算法。
问:关于OpenGL中雾的问题。
答:⾸任蚁胨狄幌翺penGL中雾的定义,OpenGL中雾的模式有三种:GL_LINEAR,GL_EXP,GL_EX
P2。以GL_LINEA为例:雾的混合因⼦f(0=<=1)的计算公式为f=(end-z)/(end-start) 。其中start 和end 为程序设置的雾的起点和终点(即glFogf(GL_FOG_START,start); glFogf(GL_FOG_END,end);)。最值得关注的是z的定义。我⼿头上有好⼏本OpenGL的参考书,但介绍了雾的定义的却只有两本。在《OpenGL编程实例与技巧》(吴斌毕丽蕴编著)中,他们认为“z表⽰视点与图元中⼼的观察坐标之间的距离”。在《OpenGL深⼊编程与实例揭秘》(彭晓明王坚编著)中,他们认为“z是像素或顶点在眼坐标系中的z坐标分量值(总为负值)”。在VC++的联机帮助中说的是“Let z be the distance in eye coordinates from the origin to thefragment being fogged. ”。如果所绘制的物体不⼤(⽐如长和宽都为1个单位的矩形),那么上⾯所说的都可以近似为:z就是视点与物体在观察坐标之间的距离(负值)。当绘制的物体很⼤时(⽐如长和宽都为200个单位的矩形),我认为上⾯的说法都值得探讨。我认为z可能是“视点与绘制物体边缘在观察坐标之间的最近距离(负值)”,上次我绘制图形时绘制了⼏个很⼤的物体,所以当我移动物体时,雾的效果并不是近处清晰,远处模糊。我想如果把⼤的物体划分为很⼩的物体进⾏绘制,就可以解决问题。
问:请问画树时如何将树设置为透明格式?
答:可以使⽤融合的⽅法。
问:我在做⼀个虚拟场景时是⽤Bezier曲⾯拟合环境中的曲⾯,然后再贴以纹理,但我发现这样极其占
⽤系统资源,⽽且我⽤了显⽰列表来处理。我想请教⼀下有没有什么别的⽅法来拟合曲⾯⽽不是那么占⽤系统资源,或者是我的⽤法不对。
答:当然不能⽤Bezier曲⾯拟合环境中的曲⾯,Bezier曲⾯需要⼤量的计算。最好的办法是直接获得曲⾯的顶点,采⽤TRANGLES或四边形来绘制。
问:我已经做好了⼀个视景,现在要做它的后视景,但是有个问题就是后视景并不能由前视景简单的经过旋转180度得到(因为后视的原理是以镜平⾯对称),例如现在将视景绕Y轴(视景坐标系)旋转180度,出来的效果是左边的物体到右边⽽右边的物体到左边了,所以也不符合,现在想请教⼀下有没有⽐较简便些的算法来实现这个后视景问题。
答:这个问题不只是旋转坐标轴,⽽是镜⾯反射编程,你可⽹上有关编程⽰例。
问:我⽤OpenGL画曲⾯,原始数据通过打开数据⽂件获取,但为什么打开⼀个数据⽂件画好后,紧接着打开另⼀个⽂件再画时,其形状和颜⾊都受第⼀次的曲⾯影响?为什么我的曲⾯重画(刷新视区)后变成了坐标系中的平⾯?即各点Z坐标的值表⾯上看似乎变的相等了?答:显然你没有重新设置颜⾊。⾄于形状,检查坐标数组。检查Z轴坐标值。另外,注意⼏何变换PushMatrix和PopMatrix。
问:如何通过屏幕坐标获取物体三维坐标?
答:使⽤gluUnProject函数。
问:如何在OpenGL中将显⽰列表的⽂本⽤字体对话框控制?
答:在显⽰列表中就不能进⾏中间变化!⽤字体对话框控制字体,只能在显⽰列表之前。
问:导⼊3D模型⽂件为什么总是不能很好的倒⼊纹理贴图,有什么办法可以很好的导⼊⼀个完整的3D模型⽂件?
答:这种情况⼀般都是由于纹理坐标错误。读带纹理3DS格式模型⼀般⽐较复杂,需要时间理解透彻才⾏,暂时可以⽤材质(不含纹理)代替。借鉴⽹上⼀些免费纹理模型贴图的⽰例也⾏呀。
问:我的⼯程将视区分为两个后(加了⼀个FormView窗体,⽤于放⼀些控制图形缩放的控件,这样它于绘图窗⼝共享原来的视区)为什么⽤OpenGL画的图不见了?我需要注意什么?错在那⾥?
答:注意设置好象素格式。
问:我⾃⼰绘的四边形⽚怎么原来有边框和界限即⼀个个的⼩⽅格,现在运⾏程序后突然变成了⼀条没有任何界限的⾊带?程序⽚段如下:
答:调⽤了glPolygonMode的填充⽅式,当然变成⾊带。
问:⽤OpenGL做⼈体动画合适吗?
答:做动画可⽤3DSMAX这样的动画软件。⽽实时开发则需要OpenGL。OpenGL是很好的三维图形库,当然做⼈体动画需要⽐较复杂的编程。
问:OpenGLExtension是什么?
答:Extension是OpenGL的扩展库,各硬件⼚家为了更好地发挥⾃⼰的芯⽚的图形性能,驱动程序⽀持许多特别有⽤的扩展库。当然,SGI 和微软⼒求统⼀标准,⽆奈象TNT2这样的芯⽚产量太⼤,所以⼚家完全可以⾃⾏其是。为此,扩展库的⽀持种类、⽀持程度与计算机中的图形卡及其驱动程序有关。象SGI NT⼯作站完全⽀持SGI发布的所有扩展库,nVIDIA TNT2图形芯⽚⼀般都⽀持nVIDIA的扩展库。所
⽀持的扩展库名称可在驱动程序显⽰⾼级设置中看到。⽬前ELSA这样的图形卡的性能较为优越,其nVIDIA GeForce2为芯⽚的图形卡所⽀持的扩展库相对⽐较完整。
问:在OpenGL中,房间漫游时总是要“穿墙⽽过”,下楼梯时总是悬浮在半空中。请教解决办法。
答:这需要图形学中的“碰撞检测”⽅法,具体过程⽐较复杂并很有技巧性。⾃⼰到⽹上看看吧。
问:请问在OpenGL的辅助库函数中是否有可以将所绘图形存为位图的函数?我想把所绘图形存为位图格式,有哪些⽅法?
答:没有现成的函数,⾃⼰写吧。
问:在标准C语⾔下,可⽤glBingTexture来贴纹理(以便硬件加速),不知道在Visual C++ 6.0下为什么不⾏,还是我没考虑到某些什么?答:检查函数的使⽤⽅法;正确安装OpenGL1.1,甚⾄OpenGL1.2。
问:Delphi和Visual C++都⽀持OpenGL,如果要编类似模拟飞⾏的程序,哪个更容易⼀些,或者说Delphi和Visual C++哪个处理图形动画更快⼀些?
答:Delphi做界⾯⽐VC较容易,做算法较⿇烦。但VC做算法和图形程序都会更好⼀些。
问:在进⾏编程时,我想把⾃⼰的三维模型或⼈体⾻骼运动输出到3DS中,不知我可到相应答案吗?答:3DS MAX好象还不能直接接受外部运动数据,但它可以⽣成运动数据(使⽤⼀些插⼊件,⽹站⾥有),或者先有运动数据后,再设法输⼊到3DSMAX中。
问:我们知道通过⼀个点的三维坐标可很⽅便地计算出在⼆维屏幕上该点的⼆维坐标(⽤OpenGL编程更容易)。但反过来,在知道⼆维显⽰坐标的前提下怎样计算出三维坐标解集(应为⼀直线)?
答:这个问题可⽤OpenGL的gluUnproject()函数。
问:在OpenGL编程中,我遇到⼀个问题:在知道三⾃由度转⾓与臂长的前提下如何计算臂长端点的空间坐标(x,y,z)。我⽤C语⾔进⾏了编程,不知OpenGL中是否有相应的函数?
答:这个问题属计算问题,需要⾃⾏编程解决,OpenGL 主要解决三维图形及效果的绘制问题。
问:请问如何解决⼤数据量的三维可视化的速度问题?除此之外还有没有别的办法?
答:OpenGL只是⼀个很好绘图渲染的库,⼤数据量的算法则需要⾃⾏编程实现。
问:⽹上⼀些程序中⽤到的纹理图像并不是位图格式,⽽是以bw或rgb为扩展名的⽂件,不知⽤什么软件才能打开这些图形⽂件,并且我想问⼀下这些图形⽂件能否转换成位图格式?我⽤Acdsee和Photoshop都打不开。
答:可以⽤Acdsee2.4版打开rgb格式图象⽂件,你也可直接在OpenGL程序中使⽤bmp⽂件,可查glu.h中的image宏。
问:请问在OpenGL下如何画凹多边形,若分解为三⾓形,则不能使⽤glPolygonMode功能,有什么办法解决。
答:⼀般都要预处理,保证不出现凹多边形,但OpenGL也提供了⼀种处理⽅法,即Tesselation分化⽅法,但占内存⼤,影响速度性能,不宜使⽤。
问:如何解决由于Win系统不⽀持spong平滑模式导致曲⾯镜⾯光不平滑的问题?
答:需要材质、⽹格密度与SMOOTH绘制模式结合。
问:如何锁定图形中部分图形对象,⽽只对某些对象进⾏操作?
答:对每个对象命名(可⽤OpenGL中的显⽰列表⽅法),然后分别控制就可。
问:有关OpenGL的颜⾊操作与纹理,材质和光照之间的关系。
答:说来话长,需好好看书。
编程哪一家比较好问:在拾取操作过程中,整个显⽰列表是否不起作⽤?如果要对单个地物进⾏操作时,是否必须单个进⾏建⽴显⽰列表?
答:显⽰列表与内存含义类似,⼀旦确定显⽰列表,其中的内容就不要改变;但可加速。
问:请问如何在不修改其他图形对象时,删除某些对象?
答:仍然⽤显⽰列表⽅法。
问:我要将⼀个⼈的照⽚⽤贴纹理的⽅法贴到⼀视景中,要使除⼈以外的部分要是透明的,⽽位图往往是矩形的,那么在编程如何才能让除⼈以外的部分透明呢?
答:可考虑使⽤stencil纹理贴图⽅法。
问:如何锁定图形中部分图形对象,⽽只对某些对象进⾏操作?
答:对每个对象命名(可⽤OpenGL中的显⽰列表⽅法),然后分别控制就可。
问:我在OpenGL中⽤⼀维求值器绘制Bezier曲线:
该Bezier曲线是由30段line构成,我需要在场景中设置⼀个物体沿该曲线路径移动,我怎么获得各个顶点的坐标值呢?反馈信息好象只包含窗⼝可见的顶点信息,有更好的办法吗?请赐教。
答:最直接的办法是你⾃⼰来计算(只是简单的Matrix变换)当然也是⽐较⿇烦的;另外可以让OpenGL帮你算,⽅法是定出物体的坐标系沿着Bezier曲线移动后的新位置,这种移动可能不唯⼀(⽐如简单的平移或利⽤曲线的切平⾯和法平⾯来定义),所以你必须定出移动的规则,有了新的坐标系数据,可以gl相应的Matrix,就可以直接显⽰了,如果要求出实际的坐标(如果只是想显⽰是没有必要计算的),⽤Matrix去乘吧。
问:我现在遇到⼀个问题,就是⽤OpenGL来画出⼀个动态的海洋,波浪涌动。因为还要有船贴图似乎不⾏,⽽计算海平⾯的三维坐标值简直太⿇烦了,巨量的点,复杂的法线...。最后⼀招,⽤3DS MAX画出来在加载进去,但格式转换也不容易。我该怎么做呢?
答:这个问题其实可以⽤很简单的⽅法解决。可⽤⼀个简单的四边形或格⽹构成海⾯框架,然后进⾏海⾯纹理贴图,让纹理动起来,不就有动态波浪海洋的场景了吗。在海⾯上的船可以继续加,各种变换照常进⾏。
问:在⽤C++Builder编写OpenGL程序时,在Scene窗⼝中,⽤⿏标移动物体,能否有办法知道移动后物体所在的坐标位置?⽤⿏标任意旋转物体,怎样知道该物体的旋转⾓度和⽅向等数值。即:物体初始
位于原点,怎样把⿏标移动物体的视觉效应转化为精确的坐标变换?答:需要建⽴⼀个新的三维坐标系,将视点、图像投影⾯(Scene窗⼝)以及物体等,⼀起定位与这个坐标系⾥。当⿏标移动时,延长视点与⿏标屏幕点的连线,使其相交与物体移动的⾯(假定使⽤⼆维⿏标,物体在XY或YZ或ZX或球⾯上移动),其交点就是物体移动后的坐标点。旋转⾓度则根据前后两次位置不同,计算出相对于某个旋转中⼼(如视点、物体中⼼点或坐标原点等)的旋转⾓度。
问:MiniGL与OpenGL的内容有什么不同?
答:MiniGL只是OpenGL的⼀个外包装,在它的内部是根据当前的显卡来决定实际的OpenGL驱动(如PowerVR、3dfx、etc..),MiniGL实际并不实现任何OpenGL功能。
问:在编写OpenGL的纹理程序时,函数auxDIBImageLoad()打开⽂件时返回“⽂件打开错误”,我希望了解调⼊位图的详细⽅法。
答:1)在调⽤该函数之前必须确认调⼊的图象是BMP格式,⽽且宽和⾼是2的n次幂。
2)OpenGL中调⼊位图⽅法。OpenGL中调⼊位图作为纹理,关键是清楚位图⽂件的结构,对于Windows下的位图,⼀般从第54个字节处开始才是图形数据,下⾯是个例⼦:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论