平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

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失败.

posted on 2005-08-13 17:24 linghuye 阅读(4370) 评论(6)  编辑 收藏 引用 所属分类: MyWarCraftStudio3D图形学研究

评论

# re: Opengl编程低级错误  回复  更多评论   

纹理没有GL_CLAMP导致边界拼接出现缝线.

真正能避免边界裂缝的只有 GL_CLAMP_TO_EDGE
2005-09-21 10:46 | KEVIN

# re: Opengl编程低级错误  回复  更多评论   

确实如此,GL_CLAMP_TO_EDGE 隶属Opengl 1.2标准,可恶的M$只给Opengl 1.1的头文件.人民感谢Opengl的扩展机制!

References:
http://home.planet.nl/~monstrous/skybox.html
2005-09-21 11:06 | 平民程序

# re: Opengl编程低级错误  回复  更多评论   

假如显卡不支持这个技术怎么办,比如我的readon9550和fx5200
我有一个程序,在贴天空体时,使用了GL_CLAMP在fx5200显卡上可以不出现纹理拼接裂缝,但是在readon9550上会出现裂缝,把GL_CLAMP去掉后,能好点,但是还是能看出来!
请问是怎么回事?怎么解决?
2005-09-24 23:16 | starwolf

# re: Opengl编程低级错误  回复  更多评论   


http://home.planet.nl/~monstrous/skybox.html
所言:
Be aware that GL_CLAMP has unpredictable behaviour at the edges, because there are many "broken" implementations.

使用GL_CLAMP_TO_EDGE, 这个扩展对显卡硬件的要求很低.只要驱动是新的都可以支持.
2005-09-24 23:28 | 平民程序

# re: Opengl编程低级错误  回复  更多评论   

写的好啊


谢谢,谢谢
2006-12-04 13:09 | Snobby

# re: Opengl编程低级错误  回复  更多评论   

22. b.glOrtho参数错误,导致2D渲染所得深度值错误,如zNear被取负数!
//______________________________________
zNear, zFar Specify the distances to the nearer and farther
depth clipping planes. These values are
negative if the plane is to be behind the
viewer.
也就是说,zNear,zFar 是可以取负数的,它们表示裁剪面在眼睛后面

透视投影才不能取负数
2008-07-12 21:06 | htzyhtzy
只有注册用户登录后才能发表评论。