初识CC_MVPMatrix


初识CC_MVPMatrix

CC_MVPMatrix是一个mat4类型的uniform,在shader代码被编译之前,它由cocos2d-x框架插入进来的。

bool GLProgram::compileShader(GLuint * shader, GLenum type, const GLchar* source)
{
    //部分代码省略
    const GLchar *sources[] = {
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32 && CC_TARGET_PLATFORM != CC_PLATFORM_LINUX && CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
  (type == GL_VERTEX_SHADER ? "precision highp float;\n" : "precision mediump float;\n"),
#endif
  "uniform mat4 CC_PMatrix;\n"
  "uniform mat4 CC_MVMatrix;\n"
  "uniform mat4 CC_MVPMatrix;\n"
  "uniform vec4 CC_Time;\n"
  "uniform vec4 CC_SinTime;\n"
  "uniform vec4 CC_CosTime;\n"
  "uniform vec4 CC_Random01;\n"
  "uniform sampler2D CC_Texture0;\n"
  "uniform sampler2D CC_Texture1;\n"
  "uniform sampler2D CC_Texture2;\n"
  "uniform sampler2D CC_Texture3;\n"
  "//CC INCLUDES END\n\n",
  source,
    };

    *shader = glCreateShader(type);
    glShaderSource(*shader, sizeof(sources)/sizeof(*sources), sources, nullptr);
    glCompileShader(*shader);
    //下面的代码省略了...
}

从上面的代码,我们可以看到, 这里除了插入CC_MVPMatrix以外,还插入了其它一些uniform。只要你在后面的main函数里面不使用这些变量,最终shader program里面是看不到它们的。(被优化掉了)

CC_MVPMatrix的作用

CC_MVPMatrix本质上是一个变换矩阵,用来把一个世界坐标系中的点转换到Clipping space。当然,如果学过OpenGL的人都知道,3D物体从建模到最终显示到屏幕上面要经历以下几个阶段:

  • 对象空间(Object Space)
  • 世界空间(World Space)
  • 照相机空间(Camera Space)
  • 裁剪空间(Clipping Space)
  • 视口空间(Viewport)

从对象空间到世界空间的变换通常叫做Model-To-World变换,从世界空间到照相机空间的变换叫做World-To-View变换,而从照相机空间到裁剪空间的变换叫做View-To-Projection。合起来,就是我们常常提到的MVP变换。这里面每一个变换都是乘以一个矩阵,3个矩阵相乘最后还是一个矩阵,也就是cocos2d-x里面的CC_MVPMatrix啦。当然,实际开发过程中,我们往往会把MV变换放到一起,一般做法如下:

gl_Position = P * MV * ObjectPosition;
优质内容筛选与推荐>>
1、Python之面向对象
2、2017-10-19 NOIP模拟赛
3、JavaScript的作用域和闭包原理
4、windows2003 在关机时要求写关机原因,怎么去掉这个选项?
5、H5页面项目的思路整理


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号