我试图通过创建自定义节点并覆盖它的绘制方法在屏幕的下半部分绘制一个蓝色矩形,起初它没有问题但是在运行大约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);
谁能告诉我出了什么问题?谢谢。
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()。
答案 0 :(得分:1)
一周前我看到了你的问题,因为没有人回答,我会尽力帮助你。我不太清楚是什么导致了你的问题,但我可以给你一些关于什么可以让你的画更好的指针,并可能摆脱这个问题。
我不知道这是否有效,你能尝试这两件事,让我知道它是怎么回事。