官术网_书友最值得收藏!

11.1 使用DrawingPrimitives接口繪制圖元

11.1.1 如何繪制圖元

Cocos2d-x的CCDrawingPrimitives.h中封裝了大量的圖元繪制接口,但要使用它們卻不那么輕松,這些接口都是直接調用OpenGL的方法進行繪制,如圖11-1是cpp-tests示例中的draw primitives示例,該示例演示了如何用圖元繪制接口。

圖11-1 draw primitives示例

在Cocos2d-x中,需要遵循規則才能正確地將圖元渲染到屏幕上,不能直接使用這些渲染接口,而是需要實現一個自定義的Node,將Node添加到場景中,在Node的draw()方法中調用這些接口進行繪制

如果不在Node的draw()方法中進行繪制,而在其他地方進行繪制,例如在update回調中繪制,則是無法渲染到屏幕上的,因為Cocos2d-x在Director的drawScene()方法中會渲染,執行的流程是update更新(這里包含了所有的Schedule、Action)、clear清除屏幕、draw繪制、swapbuffer刷新緩沖區。所以任何在update或schedule中的渲染行為,都將會被clear操作清除掉

接下來了解一下使用DrawingPrimitives的正確步驟。

(1)定義一個繼承于Node的類,并重寫其draw()方法。

(2)在draw()方法中添加一條Custom渲染命令到renderer中。

(3)在真正的繪制函數中壓入模型視圖矩陣,執行繪制,繪制完成后彈出模型視圖矩陣。

在cpp-tests中的DrawPrimitivesTest示例演示了以上步驟。以下是該示例的關鍵代碼。

      void DrawPrimitivesTest::draw(Renderer *renderer, const Mat4 &transform,
      uint32_t flags)
      {
          _customCommand.init(_globalZOrder);
          _customCommand.func = CC_CALLBACK_0(DrawPrimitivesTest::onDraw, this,
      transform, flags);
          renderer->addCommand(&_customCommand);
      }

      void DrawPrimitivesTest::onDraw(const Mat4 &transform, uint32_t flags)
      {
          Director* director = Director::getInstance();
          director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
          director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW,
          transform);

          //執行繪制
          CHECK_GL_ERROR_DEBUG();
          DrawPrimitives::drawLine( VisibleRect::leftBottom(), VisibleRect::rightTop() );
          CHECK_GL_ERROR_DEBUG();

          director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
      }

11.1.2 半透明效果

當希望在圖元渲染中,開啟半透明的效果時(默認透明通道是失效的),需要手動開啟顏色混合,然后在繪制圖元的時候指定Alpha通道。

        GL::blendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );
        glLineWidth( 2.0f );
        DrawPrimitives::setDrawColor4B(1.0f,0.8f,0.0f, 0.5f);
        DrawPrimitives::DrawLine( ccp(100.0f, 100.0f), ccp(200.0f,200.0f));

11.1.3 抗鋸齒

在繪制圖元的時候可以發現很明顯的鋸齒,如果希望圖元變得平滑一些,可以在繪制的時候手動開啟OpenGL的抗鋸齒功能,針對不同圖元類型的繪制,需要設置不同的抗鋸齒選項。首先需要用glEnable()函數開啟對應的抗鋸齒功能。

        glEnable(GL_POINT_SMOOTH);                     //對點進行抗鋸齒優化
        glEnable(GL_LINE_SMOOTH);                      //對線條進行抗鋸齒優化
        glEnable(GL_POLYGON_SMOOTH);                   //對多邊形渲染進行抗鋸齒優化

接下來用glHint()函數設置抗鋸齒的質量,glHint()函數有兩個參數,第一個是需要對哪種抗鋸齒類型進行設置,也就是對上面3種類型的其中一種,第二個參數是抗鋸齒的質量。

        glHint(GL_POINT_SMOOTH_HINT, GL_DONT_CARE);    //默認
        glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST);      //速度優先
        glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);       //畫質優先
主站蜘蛛池模板: 鹤山市| 收藏| 商城县| 虎林市| 灵璧县| 闸北区| 英吉沙县| 泸西县| 石城县| 枣强县| 和田县| 深圳市| 通州市| 贵定县| 田东县| 濉溪县| 长葛市| 明水县| 黑水县| 吕梁市| 北流市| 呼图壁县| 新密市| 千阳县| 望江县| 厦门市| 肇庆市| 揭西县| 共和县| 陵川县| 漳浦县| 米脂县| 盐山县| 如皋市| 兴隆县| 桦南县| 阿拉善左旗| 思南县| 海晏县| 若羌县| 焉耆|