[Cocos2d-x 3.8 win32]覆盖绘制方法闪烁纹理

时间:2015-11-05 11:01:27

标签: cocos2d-x cocos2d-x-3.0

我试图通过创建自定义节点并覆盖它的绘制方法在屏幕的下半部分绘制一个蓝色矩形,起初它没有问题但是在运行大约10秒之后它出现了一些奇怪的垂直条纹在纹理上闪烁。

这是我的代码: 的 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 个答案:

答案 0 :(得分:1)

一周前我看到了你的问题,因为没有人回答,我会尽力帮助你。我不太清楚是什么导致了你的问题,但我可以给你一些关于什么可以让你的画更好的指针,并可能摆脱这个问题。

  1. 将您的setShaderProgram移出绘图功能,只执行一次
  2. 将您的set命令移出draw函数,以确保您的回调只注册一次,并且不会导致多次回调(这可能会影响某些事物的绘制顺序)
  3. 我不知道这是否有效,你能尝试这两件事,让我知道它是怎么回事。