2015-11-05 42 views
0

我試圖通過創建自定義節點並重寫它的繪製方法在屏幕的下半部分繪製藍色矩形,起初它沒有問題,但運行後大約10秒後,紋理上出現了一些奇怪的垂直條紋閃爍。[Cocos2d-x 3.8 win32]重寫繪製方法閃爍紋理

這裏是我的代碼: Water.cpp

#define COLOR_LIGHT_BLUE Color4F(0.2 , 0.5, 1, 0.5) 
#define COLOR_MIDNIGHT_BLUE Color4F(0, 0, 1, 1) 

Water::Water(int w, int h, int segments){ 
    width = w; 
    height = h; 
    springsNum = segments + 1; 

    springs = new Point[springsNum]; 
    vertices = new Point[springsNum * 2]; 
    colors = new Color4F[springsNum * 2]; 

    distanceBetweenSprings = (float)width/(float)segments; 
    for (int i = 0; i < springsNum; i++){ 
     springs[i] = Point(i * distanceBetweenSprings, 0); 
    } 

} 

void Water::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){ 
    setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_COLOR)); 
    CC_NODE_DRAW_SETUP(); 
    GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR); 

    auto customCommand = new CustomCommand(); 
    customCommand->init(getGlobalZOrder()); 
    customCommand->func = CC_CALLBACK_0(Water::onDraw, this); 
    renderer->addCommand(customCommand); 
} 

void Water::onDraw(){ 
    int j = 0; 
    for (int i = 0; i < springsNum; i++){ 
     colors[j] = COLOR_MIDNIGHT_BLUE; 
     vertices[j++] = springs[i]; 
     colors[j] = COLOR_LIGHT_BLUE; 
     vertices[j++] = Point(springs[i].x, height); 
    } 

    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); 
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, colors); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, springsNum * 2); 
} 

在主場景:

water = new Water(visibleSize.width, visibleSize.height/2, visibleSize.width/8); 
this->addChild(water); 

在第一遊戲運行正常,像這樣: normal

但大約10秒後,顏色混亂: stripped

任何人都可以告訴我出了什麼問題?謝謝。 PS:我想保持段數高,以便我可以創建飛濺效果(http://gamedevelopment.tutsplus.com/tutorials/make-a-splash-with-dynamic-2d-water-effects--gamedev-236)。如果segments = 1,它運行良好。另外,當我設置DebugDrawMask(DEBUGDRAW_ALL)時,問題從頭開始。

解決:實際上,將3行(setShaderProgram; CC_SETUP ..和enableVertexAttrib)移動到每幀調用的onDraw()方法是什麼?

回答

1

我在一週前看到你的問題,因爲沒有人回答我會盡力幫助你。我不太清楚是什麼原因導致了你的問題,但是我可以給你一些關於什麼可以讓你的畫更好的指示,並且可以擺脫這個問題。

  1. 將您setShaderProgram出你繪製函數,並做到這一點只有一次
  2. 將您的set命令出平局的功能,以確保您的回調僅僅是註冊一次,並不會導致多個回調(可干擾某些東西的繪製順序)

我不知道這是否可行,你可以嘗試這兩件事情,讓我知道它是怎麼回事。

+0

我解決了這個問題,但我忘了更新堆棧上的答案,但謝謝你回答我的問題。其實訣竅是將3行(setShaderProgram; CC_SETUP ..和enableVertexAttrib)移動到每幀調用的onDraw()中。 – someRandomDude