- 精通Cocos2d-x游戲開發(進階卷)
- 王永寶
- 788字
- 2020-11-28 22:37:09
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); //畫質優先