错误使用 * 内部矩阵维度必须一致。_一步步学OpenGL(5) -《一致变量》

c326c1a59d8c090bf828fc6720aee003.png

教程 5:

一致变量

088754477b04a1194c8564ed50eba12f.png

原文: Uniform Variables

CSDN完整版专栏: 专栏:一步步学OpenGL3.3+ - 博客频道 - CSDN.NET

背景

在这个教程中我们将遇到一个新的shader变量:一致变量(Uniform Variables)。一致变量和普通属性的区别:普通变量所包含的数据是顶点具体化的,所以在每个着色器引入的时候它们将从顶点缓冲区加载一个新的值;但是一致变量的值在整个draw call中保持不变。这意味着你在draw call之前加载一直变量的值之后,你可以在每一个顶点着色器引入的时候总可以取得相同的值。一致变量主要的作用是保存像光照参数(光的位置和方向等)、变换矩阵、材质对象的handle等数据。

在这个教程中我们最后可以让图形在屏幕上产生移动,我们使用一个每一帧的值都会改变的一致变量和GLUT提供的一个闲置的回调来实现移动的效果。问题是如果不是必须的话GLUT不会重复调用我们的渲染回调。GLUT只有在像最大最小化窗口或者从另外一个窗口后面重新出现等这样的事件下才会必须重新调用我们的渲染回调。如果在应用启动后我们没有在窗口布局中做任何变化那么渲染回调只会被执行一次,这个可以通过在渲染函数中添加一个prinf打印语句可以验证,你会看到只会输出一次,但如果你最小化窗口然后最大化窗口的话会再次看到输出。 在之前的教程中只在GLUT中注册渲染回调是可以的,但是现在我们想多次重复的改变一个变量的值,需要通过再注册一个闲置的函数回调。这个闲置的函数会被GLUT在没有收到任何窗口事件的时候被调用。你可以使用一个专门的函数用于这个回调,在函数内做一些像时间更新的工作或者只是简单地注册这么一个渲染回调作为待用的闲置回调函数。在我们这个教程中我们将在这个渲染回调函数中更新变量的值。

源代码详解

(1)glutIdleFunc(RenderSceneCB);

这里我们将渲染回调注册为全局闲置回调。注意如果你决定使用一个专用的闲置回调那需要在它后面添加一个glutPostRedisplay()以标记重新绘制窗口,不然那个闲置回调会被不停的调用但渲染函数却不会被调用,看不到效果。glutPostRedisplay()标记当前的窗口需要被重新绘制,当下一个GLUT的主循环开始的时候这个渲染回调就会被调用了。

(2)

gScaleL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值