OpenGL学习随笔(七)

本文通过解决两个实际问题,探讨了OpenGL中的矩阵堆栈管理和纹理尺寸限制。揭示了理论与实践之间的差距,并强调了动手实践的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候,知识难以常握是因为我们只知其表不知其里,或者说不了解历史就不能理解现在。所以在学习到一定程度之后一定要去分析和实现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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值