OpenGL 入门4
来源:互联网 发布:复制文件 linux 编辑:程序博客网 时间:2024/06/06 09:17
原帖地址:
http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html
http://blog.csdn.net/cordova/article/details/52504118
Uniform variables
Uniform variable和之前gl_Position等内置变量是略有不同的。每次有shader调用的时候,内置变量的数据是从顶点缓存中取得的,而uniform variable的数据一般是来自程序中的变量。uniform variable的作用很多,一般我们可以用它来存储光源位置,光源方向,变换矩阵或者贴图对象句柄等。
API
glutIdleFunc(RenderSceneCB);
之前设定的glutDisplayFunc()中的回调函数,也就是渲染图像的回调函数在opengl中并不会一直被调用。通常会在第一次创建完窗口之后调用一次,之后每改变窗口的大小、位置或者是发生窗口覆盖事件时会调用一次。为了实现动画,我们必须要让这个渲染回调不停的调用,这是就要使用上面的函数。以上函数的作用是在没有收到任何窗口消息时,不停的调用RenderSceneCB函数,我们可以把这个函数设置成glutDisplayFunc()中的渲染回调函数,那么窗口就会不停的绘制了。
gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");assert(gScaleLocation != 0xFFFFFFFF);
当我们在编译GLSL程序的时候,GLSL编译器会给每个uniform variable一个索引。我们可以使用glGetUniformLocation来获取到这个索引。如果没有获取到这个索引,那么返回值gScaleLocation就会是-1。造成返回值为-1的情况通常有两种,第一种情况是我们在shader中声明的那个uniform ariable没有被使用,那么GLSL编译器就会在优化的过程中把它丢掉,第二种情况是输入的uniform variable的名字错误,和shader中的名字不相同。
static float Scale = 0.0f;Scale += 0.001f;glUniform1f(gScaleLocation, sinf(Scale));
我们声明了一个float型的Scale,每一次draw call我们把他的值增加0.001,并且用glUniform1f函数将这个浮点数的余弦值传给gScaleLocation。这里glUniform1f中的1f代表传入的是一个浮点数。还有其他类似的后缀,比如:3i,3f,2i等等。
uniform float gScale;
在shader程序里,我们声明了一个uniform variable,叫做gScale。这个和glGetUniformLocation()中的名字是一样的。我们从c/c++传入的数据就存在gScale里面。
gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0);
我们将传入的gScale乘上顶点的x,y坐标,让所渲染图形的x,y坐标呈现周期行的变化。
- opengl入门4
- OpenGL 入门4
- OpenGL入门
- OpenGL 入门
- Opengl入门
- OpenGL 入门
- OpenGL 入门
- opengl入门
- OpenGL入门
- opengl入门
- OpenGL入门
- openGL入门
- opengl入门
- opengl入门
- OpenGL入门
- OPENGL入门
- OpenGL入门
- OpenGl入门
- 使用Maven时指定JDK版本
- 你为什么一定要学Python?
- 实现小说翻页功能
- 2017年大数据的十大发展趋势
- Iphone连不上电脑的解决方法
- OpenGL 入门4
- 【例题】【树链剖分】
- [Qt creator+Linux]安装UUID(libuuid)以及问题undefined reference to uuid generate
- EasyUI学习之DataGird
- Heritrix3.1.1使用教程
- 连接redis报此错误:ERR Client sent AUTH, but no password is set
- 如何选择Python版本2还是3
- ansible入门
- PDO