初识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;
posted @ 2016-05-25 23:06  全绍辉  阅读(3179)  评论(0编辑  收藏  举报