OpenGL ES2.0教程(3):初识MVP
2014-08-27 22:21
225 查看
http://cn.cocos2d-x.org/tutorial/show?id=1349
OpenGL ES2.0教程(3):初识MVP
子龙山人2014-08-19 10:04:28861 次阅读在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix。它其实是一个uniform,每一个Cocos2d-x预定义的shader都包含有这个uniform,但是如果你在shader里面不使用这个变量的话,OpenGL底层会把它优化掉。
但是,CC_MVPMatrix是在什么时候设置进来的呢?我在shader里面明明没有看到它,它从哪儿来的?别急,请继续往下读。
初识Uniform
在回答上面几个问题之前,让我们先来介绍一下什么是uniform。简单来说,uniform是shader里面的一种变量,它是由外部程序设置进来的,它不像vertex的attribute,每个顶点都有一份数据。除非你显式地调用glUniformXXX函数来修改这个uniform的值,否则它的值恒定不变。接下来,让我们修改myFragmentShader.frag,给它添加一个新的uniform数据:
首先,我们需要获得这个uniform在shader里面的位置。
初识CC_MVPMatrix
CC_MVPMatrix是一个mat4类型的uniform,在shader代码被编译之前,它由Cocos2d-x框架插入进来的。
CC_MVPMatrix的作用
CC_MVPMatrix本质上是一个变换矩阵,用来把一个世界坐标系中的点转换到Clipping space。当然,如果学过OpenGL的人都知道,3D物体从建模到最终显示到屏幕上面要经历以下几个阶段:
对象空间(Object Space)
世界空间(World Space)
照相机空间(Camera Space/Eye Space)
裁剪空间(Clipping Space)
设备空间(normalized device space)
视口空间(Viewport)
从对象空间到世界空间的变换通常叫做Model-To-World变换,从世界空间到照相机空间的变换叫做World-To-View变换,而从照相机空间到裁剪空间的变换叫做View-To-Projection。合起来,就是我们常常提到的MVP变换。这里面每一个变换都是乘以一个矩阵,3个矩阵相乘最后还是一个矩阵,也就是Cocos2d-x里面的CC_MVPMatrix啦。当然,实际开发过程中,我们往往会把MV变换放到一起,一般做法如下:
修改CC_MVPMatrix
我们怎么样修改CC_MVPMatrix呢?前面介绍过uniform变量的修改方法在这里是适用的,我们可以先通过glGetUniformLocation来获取这个uniform的入口,然后调用glUniformMatrix4fv来给它传值就行了。
但是,等等。我该怎么计算这个矩阵的值呢?有两个函数glLookAt和glPerspective可以做这些事,具体的用法 ,大家可以参考CCDirector.cpp里面的代码。我就不在此处展开讨论了,另外强烈推荐大家运行此网页中的一个演示程序,用来加深于这两个函数的理解。
在Cocos2d-x里面,我们可以通过修改矩阵栈里面的ModelView和Projection栈顶元素,从而修改ModelView和Projection矩阵,最终达到修改CC_MVPMatrix的目的。
首先,让我们在onDraw函数的最开头加入下列代码:
设备空间(normalized device space)
为了解决上述问题,我们只需要把对象的顶点数据修改为:
所以,如果我们要想显示同之前一模一样的三角形,就必须修改这个顶点数据,让它的取值范围落在Clipping Space以内。这也是我们在其它许多书本上面看到的规范的三角形的范例。
结语
最后,按照惯例,附上本教程的源码下载地址
推荐阅读
https://www.youtube.com/watch?v=-tonZsbHty8&index=26&list=PLRwVmtr-pp06qT6ckboaOhnm9FxmzHpbY
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
http://blog.db-in.com/cameras-on-opengl-es-2-x/ (强烈推荐)
相关文章推荐
- Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
- Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
- OpenGL ES2.0教程:初识MVP(3)
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
- 基于Cocos2d-x学习OpenGL ES 2.0系列——初识MVP(3)
- 基于Cocos2d-x学习OpenGL ES 2.0系列——初识MVP(3)
- OpenGL ES2.0教程:纹理贴图(6)
- OpenGL ES 2.0教程:你的第一个三角形(1)
- iOS OpenGL ES2.0教程 Lesson03 旋转
- iOS OpenGL ES 2.0教程 Lesson04--3D空间
- iOS OpenGL ES2.0教程 Lesson03 旋转 投影矩阵,相机矩阵,世界矩阵生效
- [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02
- OpenGL ES2.0教程:编写自己的shader(2)
- (转载)Cocos2dx-OpenGL ES2.0教程:使用VBO索引(4)
- iPhone OpenGL ES 2.0 教程
- Cocos2dx-OpenGL ES 2.0教程:你的第一个三角形(1)
- (转载)Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)
- iOS OpenGL ES 2.0教程 Lesson04--3D空间
- iOS OpenGL ES2.0教程 Lesson03 旋转
- [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02