关于在Box2dTest中开启调试打印

关于在Box2dTest中开启调试打印
    关于在Box2dTest中开启调试打印,实际就是使用OpenGL直接绘图方法绘制Box2d相关的信息,不过这个绘制是通过world->DrawDebugData()函数来完成的,我们无须多加干预,但是需要在其开始工作之前为其设置好工作环境。具体代码及注释如下:
    代码中的一些问题的解释:
    1、关于矩阵堆栈的问题
    问了问度娘,其中有一段解释,总体而言就是这是OpenGL的工作模式决定的。
    1)OpenGL物体建模实际上是分两步走的。第一步,在世界坐标系的原点位置绘制出该物体;第二步,通过modelview变换矩阵对世界坐标系原点处的物体进行仿射变换,将该物体移动到世界坐标系的目标位置处。
    2)OpenGL中的modelview矩阵变换是一个马尔科夫过程:上一次的变换结果对本次变换有影响,上次modelview变换后物体在世界坐标系下的位置是本次modelview变换的起点。默认是本次变换和上次变换不独立。
    3)凡是使用glPushMatrix()和glPopMatrix()的程序一般可以判定是采用世界坐标系建模。既世界坐标系固定,modelview矩阵移动物体。
    4)将modelview变换放在glPushMatrix和glPopMatrix之间可以使本次变换和上次变换独立。
    以上就是glPushMatrix()和glPopMatrix()成对使用的原因。一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成的复杂模型。例如,一辆自行车就是由两个轮子、一个三角架及其它一些零部件构成的。它的继承性表现在当自行车往前走时,首先是前轮旋转,然后整个车身向前平移,接着是后轮旋转,然后整个车身向前平移,如此进行下去,这样自行车就往前走了。将上述模型的构造过程放在glPushMatrix和glPopMatrix之间,则本次汽车在世界坐标系中的位置不是基于上一次汽车的位置而给出的(以前一次的位置为参考),而是直接给出的以世界下的坐标(以世界坐标系的原点为参考)。整个过程是符合人的思维过程的,由于每次建模都是以单位阵为变换起点,故便于采用统一的实现方式进行处理。将本次需要执行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响。使本次变换是以世界坐标系的原点为参考点进行。
    矩阵堆栈对复杂模型运动过程中的多个变换操作之间的联系与独立十分有利。因为所有矩阵操作函数如glLoadMatrix()、glMultMatrix()、glLoadIdentity()等只处理当前矩阵或堆栈顶部矩阵,这样堆栈中下面的其它矩阵就不受影响。为了更好地理解这两个函数,我们可以形象地认为glPushMatrix()就是“记住自己在哪”,glPopMatrix()就是“返回自己原来所在地”。
    就这个来理解本例中的代码,大概就是以下这个意思:记住现在的位置,并且记住现在要做的那些变形,然后设置并调用自定义的绘画函数,在自定义函数中记住当前位置(猜测自定义函数的上下文环境和外面已经保存的这个不一样),并且使用记住的那些变形操作进行当前图形的绘制,完成后还原自定义函数的环境,自定义函数执行完成回到draw中,然后在draw中返回自己原来的位置。
    2、关于GL::enableVertexAttribs的问题
    实话实说,不知道是啥,反正不打算研究OpenGL。《捕鱼达人》代码大揭秘那本书上是这么说的:Cocos2dx中最大的变革是引入了OpenGL ES 2.0作为底层绘图,意味着渲染从过去的固定管线升级到了可编程管线,我们可以通过着色器定义每一个顶点或像素的着色方式。在渲染流水线上,存在两个对开发者可见的可编程着色器:
    顶点着色器(Vertex Shader):对每个顶点调用一次,完成顶点变换、法线变换……等操作,并最终确定渲染区域。在Cocos中,精灵和层都是矩形,他们的一次渲染会调用4次顶点着色器。
    段着色器(Fragment Shader):个人认为翻做碎片着色器更贴切些。这个着色器会在每个像素被渲染的时候调用,通常这个过程由显卡的图形处理单元并行化完成。
    这两个着色器不能单独使用,必须成对配合出现,因为顶点着色器会首先确定每一个显示到屏幕上的顶点的属性,然后这些顶点组成的区域被划分成一系列像素,由段着色器来完成剩下的工作。《捕鱼达人》就说到这里了,因为这是一门“高深的学问”,我也不打算多深入,不过度娘还是帮我们找到了以上这段话的英文原文,感兴趣的兄弟们可以瞟一眼。
    3、关于world->DrawDebugData上的那句注释:
    其实,如果不调用world的调试打印函数,以上的所有准备工作都等同于在Cocos2dx中使用OpenGL直接绘图的准备工作,不同的只在这里,如果不是调用world的调试打印函数,这里其实可以调用glLineWidth设置线宽,调用DrawPrimitives相关函数如drawLine等进行自定义绘图了。当然,有兄弟已经写了详细的方法,这里不献丑了。值得一提的是该文代码里有关矩阵堆栈的处理,似乎又与Box2dTest示例中的用法不同,貌似更漂亮一些。

你可能感兴趣的:(关于在Box2dTest中开启调试打印)