很多时候,知识难以常握是因为我们只知其表不知其里,或者说不了解历史就不能理解现在。所以在学习到一定程度之后一定要去分析和实现OpenGL,之后才能真正理解和掌握OpenGL。
每天在不断学习新的内容时,我都会选择重写测试代码,而不是在之前的代码上修改,原因是想找出一些思维定势和盲区。今天尝试用push和pop来写reshape时,就发现自己理解还不到位,
static void reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
gluPerspective(45, 1, 0.1, 1000);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
static void init()
{
glLoadIdentity();
...
}
static void display()
{
glPushMatrix();
...
glPopMatrix();
}
原以为整个OpenGL中只有一个矩阵堆栈,投影变换之后要恢复矩阵,结果什么也显示不出来。以为是一开始没有装入单位矩阵所致,于是又在init中加了glLoadIdentity,但还是没有图象。
而实际上OpenGL中有多个矩阵堆栈,模型视点变换,投影变换,纹理均有自己的矩阵堆栈,且每个堆栈的栈底初始值可能都是单位矩阵。像上面这样写没有图像的原因是原本投影变换的结果被存于投影变换的栈顶,而多写了一句glPopMatrix之后,栈顶被弹出剩下的只是单位矩阵了。
今天遇到的另一个问题是纹理尺寸必须为2次幂。在Mesa跑得好好的程序居然在非Mesa环境贴图失败,后来终于在redbook第4版的一个角落里找到这样一句话,“width和height的值都必须是2 的幂次”,然后在第6版的同一个角落里又增加了一句“OpenGL 2.0取消了该限制”,当场就要抓狂了。
以上两个问题都是由于想抛开书本自己写两个程序以检测是否真的理解了之前学的知识,结果写两个程序出来两个问题。结果在预料之中,这就是理论和实践的差距,看书只能知道个大概,要真正掌握(特别是细节内容)必须要动手,再次证明计算机是个实践性极强的科学,I love it!
每天在不断学习新的内容时,我都会选择重写测试代码,而不是在之前的代码上修改,原因是想找出一些思维定势和盲区。今天尝试用push和pop来写reshape时,就发现自己理解还不到位,
static void reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
gluPerspective(45, 1, 0.1, 1000);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
static void init()
{
glLoadIdentity();
...
}
static void display()
{
glPushMatrix();
...
glPopMatrix();
}
原以为整个OpenGL中只有一个矩阵堆栈,投影变换之后要恢复矩阵,结果什么也显示不出来。以为是一开始没有装入单位矩阵所致,于是又在init中加了glLoadIdentity,但还是没有图象。
而实际上OpenGL中有多个矩阵堆栈,模型视点变换,投影变换,纹理均有自己的矩阵堆栈,且每个堆栈的栈底初始值可能都是单位矩阵。像上面这样写没有图像的原因是原本投影变换的结果被存于投影变换的栈顶,而多写了一句glPopMatrix之后,栈顶被弹出剩下的只是单位矩阵了。
今天遇到的另一个问题是纹理尺寸必须为2次幂。在Mesa跑得好好的程序居然在非Mesa环境贴图失败,后来终于在redbook第4版的一个角落里找到这样一句话,“width和height的值都必须是2 的幂次”,然后在第6版的同一个角落里又增加了一句“OpenGL 2.0取消了该限制”,当场就要抓狂了。
以上两个问题都是由于想抛开书本自己写两个程序以检测是否真的理解了之前学的知识,结果写两个程序出来两个问题。结果在预料之中,这就是理论和实践的差距,看书只能知道个大概,要真正掌握(特别是细节内容)必须要动手,再次证明计算机是个实践性极强的科学,I love it!