现在的位置: 首页 > 综合 > 正文

OpenGL编程低级错误及常见问题解答

2013年09月11日 ⁄ 综合 ⁄ 共 4200字 ⁄ 字号 评论关闭

低级错误

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.灯光位置应该是4float3float程序不出错,但结果完全扭曲。

10.打开灯光却没设置顶点法线,到头一场空。

11.Window Class 没有CS_OWNDC,导致glDrawPixels失败,如在子窗口View上进行象素写入操作.

12.没有设置PIXELFORMATDESCRIPTORcAlphaBits=8,导致glReadPixels读取alpha通道数据失败,统统为0.

13.手动实现的多层纹理闪烁,出现线带,没有使用glPolygonOffset.

14.glDrawPixels格式GL_RGBGL_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.没有显示定义shiniessshiniess0,shader中对gl_FrontMaterial.shininess使用pow计算,结果不可测,黑色条带闪烁,quite not understand.

 

 

常见错误

问:OpenGL中的Stencil Buffer是什么东西?
答:模板缓存(Stencil Buffer)。它可以保持屏幕上某些部位的图形不变,而其它部位仍然可以进行图形绘制。比方说,可以通过模板缓存来绘制透过汽车挡风玻璃观看车外景物的画面。首先,将挡风玻璃的形状存贮到模板缓存中去,然后再绘制整个场景。这样,模板缓存挡住了通过挡风玻璃看不见的任何东西,而车内的仪表及其它物品只需绘制一次。因此,随着汽车的移动,只有外面的场景在不断地更改。


问:glos.h是什么文件?
答:判别操作系统的头文件。

 

问:OpenGL的左右缓冲区如何使用?即:gldrawbuffer()中的,GL_RIGHTGL_LEFT参数的使用。我想做一副立体图,(两副图像交替在屏幕上不停刷新)。 图形加速卡选用的是华硕的3800带立体镜的那一种。
答:这需要看驱动程序是否支持OpenGL的左右缓冲区。据我们所知,华硕显卡不带这样的驱动。而象Diamond Fire GL系列、ELSAGlorial系列等显卡支持这种功能。在购买显卡时,应认清驱动程序的支持性能。

 

问:请问用在OpenGL编程中有哪些方法可以得到两个曲面的交线?
答:OpenGL用于绘制图形,没有交线计算,需要自行开发算法

 

问:关于OpenGL中雾的问题。
答:首任蚁胨狄幌翺penGL中雾的定义,OpenGL中雾的模式有三种:GL_LINEARGL_EXPGL_EXP2。以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 the fragment being fogged. ”。如果所绘制的物体不大(比如长和宽都为1个单位的矩形),那么上面所说的都可以近似为:z就是视点与物体在观察坐标之间的距离(负值)。当绘制的物体很大时(比如长和宽都为200个单位的矩形),我认为上面的说法都值得探讨。我认为z可能是视点与绘制物体边缘在观察坐标之间的最近距离(负值),上次我绘制图形时绘制了几个很大的物体,所以当我移动物体时,雾的效果并不是近处清晰,远处模糊。我想如果把大的物体划分为很小的物体进行绘制,就可以解决问题。

 

问:请问画树时如何将树设置为透明格式?
答:可以使用融合的方法。

 

问:我在做一个虚拟场景时是用Bezier曲面拟合环境中的曲面,然后再贴以纹理,但我发现这样极其占用系统资源,而且我用了显示列表来处理。我想请教一下有没有什么别的方法来拟合曲面而不是那么占用系统资源,或者是我的用法不对。
答:当然不能用Bezier曲面拟合环境中的曲面,Bezier曲面需要大量的计算。最好的办法是直接获得曲面的顶点,采用TRANGLES或四边形来绘制。

 

问:我已经做好了一个视景,现在要做它的后视景,但是有个问题就是后视景并不能由前视景简单的经过旋转180度得到(因为后视的原理是以镜平面对称),例如现在将视景绕Y轴(视景坐标系)旋转180度,出来的效果是左边的物体到右边而右边的物体到左边了,所以也不符合,现在想请教一下有没有比较简便些的算法来实现这个后视景问题。
答:这个问题不只是旋转坐标轴,而是镜面反射编程,你可网上有关编程示例。

 

问:我用OpenGL画曲面,原始数据通过打开数据文件获取,但为什么打开一个数据文件画好后,紧接着打开另一个文件再画时,其形状和颜色都受第一次的曲面影响?为什么我的曲面重画(刷新视区)后变成了坐标系中的平面?即各点Z坐标的值表面上看似乎变的相等了?
答:显然你没有重新设置颜色。至于形状,检查坐标数组。检查Z轴坐标值。另外,注意几何变换PushMatrixPopMatrix

 

问:如何通过屏幕坐标获取物体三维坐标?
答:使用gluUnProject函数。

 

问:如何在OpenGL中将显示列表的文本用字体对话框控制?
答:在显示列表中就不能进行中间变化!用字体对话框控制字体,只能在显示列表之前。

 

问:导入3D模型文件为什么总是不能很好的倒入纹理贴图,有什么办法可以很好的导入一个完整的3D模型文件?
答:这种情况一般都是由于纹理坐标错误。读带纹理3DS格式模型一般比较复杂,需要时间理解透彻才行,暂时可以用材质(不含纹理)代替。借鉴网上一些免费纹理模型贴图的示例也行呀。

 

问:我的工程将视区分为两个后(加了一个FormView窗体,用于放一些控制图形缩放的控件,这样它于绘图窗口共享原来的视区)为什么用OpenGL画的图不见了?我需要注意什么?错在那里?
答:注意设置好象素格式。

 

问: 我自己绘的四边形片怎么原来有边框和界限即一个个的小方格,现在运行程序后突然变成了一条没有任何界限的色带?程序片段如下:
glPolygonMode(GL_FRONT,GL_FILL); 111
glBegin(GL_QUAD_STRIP);
for(i=0;i<=HEIGHTNUMBER;i++)
{
glVertex3f(base,Ybase- i*Yalphe,0.0);
glColor3f(m_getMinR+i*Redalphe,
m_getMinG+i*Greenalphe,m_getMinB+i*Bluealphe);
}
glEnd();
答:调用了glPolygonMode的填充方式,当然变成色带。

 

 

 

问:用OpenGL做人体动画合适吗?
答:做动画可用3DSMAX这样的动画软件。而实时开发则需要OpenGLOpenGL是很好的三维图形库,当然做人体动画需要比较复杂的编程。

 

问:OpenGL Extension是什么?
答:ExtensionOpenGL的扩展库,各硬件厂家为了更好地发挥自己的芯片的图形性能,驱动程序支持许多特别有用的扩展库。当然,SGI和微软力求统一标准,无奈象TNT2这样的芯片产量太大,所以厂家完全可以自行其是。为此,扩展库的支持种类、支持程度与计算机中的图形卡及其驱动程序有关。象SGI NT工作站完全支持SGI发布的所有扩展库,nVIDIA TNT2图形芯片一般都支持nVIDIA的扩展库。所支持的扩展库名称可在驱动程序显示高级设置中看到。目前ELSA这样的图形卡的性能较为优越,其nVIDIA GeForce2为芯片的图形卡所支持的扩展库相对比较完整。

 

问:在OpenGL中,房间漫游时总是要穿墙而过,下楼梯时总是悬浮在半空中。请教解决办法。
答:这需要图形学中的

抱歉!评论已关闭.