我試圖通過創建自定義節點並重寫它的繪製方法在屏幕的下半部分繪製藍色矩形,起初它沒有問題,但運行後大約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);
任何人都可以告訴我出了什麼問題?謝謝。 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()方法是什麼?
我解決了這個問題,但我忘了更新堆棧上的答案,但謝謝你回答我的問題。其實訣竅是將3行(setShaderProgram; CC_SETUP ..和enableVertexAttrib)移動到每幀調用的onDraw()中。 – someRandomDude