最近用了一个多月的OpenGL,深感做Graphics对编程能力的要求和Image Processing不是一个档次的。OpenGL的使用需要对其有着深入了解才不容易出问题,否则一个细节上的疏忽都有可能让你跪了。一些小问题整理下吧,有些我也不知道答案,只找到了原因,但不知道为什么。
1.关于OpenGL的坐标系:http://blog.csdn.net/firefly_liu/article/details/4160296 特别要指出的是绘图时候(0,0)点在屏幕中心(没有做变换的前提下),而纹理坐标的(0,0)点却在左下角,有的时候需要做相应的坐标转换。
2.OpenGL下纹理的尺寸:http://blog.sina.com.cn/s/blog_62a8419a0100oksc.html 据说纹理的尺寸只能是2的幂,而且纹理的最大尺寸和显卡参数有关,但是也有文章说现如今的显卡貌似没有2的幂这个规定了,但是我在使用过程中发生了诡异的问题,因此还是遵循这个约定吧。
3.纹理的使用方法:http://www.cppblog.com/zmj/archive/2006/01/17/2816.html 纹理也是内存中的一块区域,因此其操作和VBO有点相似呢,在http://www.cppblog.com/w2001/archive/2008/05/10/49376.aspx这篇文章中给出了这种对比关系。纹理的使用时不要忘了glEnable(GL_TEXTURE_1D);以及 glBindTexture(GL_TEXTURE_2D, texID);
4.关于绘图更新 可以简单调用glutPostRedisplay函数使得当前绘图强制更新一次
5.关于glEnable(GL_DEPTH_TEST) 某个时候发现在屏幕上绘制东西的时候不起作用,原因就是这个函数,这个函数的作用是:用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。
6.关于一维纹理的使用 一维纹理和二维纹理很相似,有的时候计算会用到一维纹理。参考:http://stackoverflow.com/questions/3243752/opengl-gl-texture-1d-trouble和http://stackoverflow.com/questions/4103905/why-does-texture1d-in-glsl-return-a-vec4
7.关于Shader使用中的问题 纹理的设置要放在Shader设置前面,否则Shader找不到纹理。另外若不使用Shader的时候需要注释掉Shader初始化以及Shader赋值的语句,只是注释前者的话Shader也会发生作用,猜测是OpenGL内部有个默认的Shader(纯猜测!)。