У меня есть вогнутый многоугольник. Первое, что я делаю, это триангулировать его и хранить все точки треугольника в массиве вершин. Я пытаюсь заполнить этот многоугольник текстурой или цветом, но ни одно из двух решений не работает.Заполните многоугольник с текстурой/цветом, используя CCRenderTexture
Вот код при попытке получить текстуру одним цветом:
CCTexture2D* TextureTest::textureColorWithVertices(CCPoint* vertices,
int count,
CCRect spriteRect)
{
CCRenderTexture *renderTexture = CCRenderTexture::create(spriteRect.size.width, spriteRect.size.height);
renderTexture->beginWithClear(1, 1, 1, 0);
mShaderProgram->use();
mShaderProgram->setUniformForModelViewProjectionMatrix();
ccVertex2F* verts = new ccVertex2F[count];
for(int i=0;i<count;i++) {
verts[i].x = vertices[i].x + spriteRect.size.width/2;//*CC_CONTENT_SCALE_FACTOR();
verts[i].y = vertices[i].y + spriteRect.size.height/2;//*CC_CONTENT_SCALE_FACTOR();
}
ccColor4F* colors = new ccColor4F[count];
ccColor4F red = ccc4f(1, 0, 0, 1);
for (int i = 0; i < count; i++)
{
colors[i] = red;
}
glDisable(GL_TEXTURE_2D);
mShaderProgram->setUniformLocationWith4f(mColorLocation, 1.0f, 1.0f, 1.0f, 1.0f);
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_FLOAT, GL_FALSE, 0, colors);
glDrawArrays(GL_TRIANGLES, 0, count);
glEnable(GL_TEXTURE_2D);
CC_INCREMENT_GL_DRAWS(1);
delete[] colors;
delete[] verts;
renderTexture->end();
return renderTexture->getSprite()->getTexture();
}
, а другой с 256 * 256 бесшовных текстур:
CCTexture2D* TextureTest::textureWithVertices(CCPoint* vertices,
int count,
CCTexture2D* baseTexture,
CCRect spriteRect)
{
CCRenderTexture *renderTexture = CCRenderTexture::create(spriteRect.size.width, spriteRect.size.height);
renderTexture->beginWithClear(1, 1, 1, 0);
mShaderProgram->use();
mShaderProgram->setUniformForModelViewProjectionMatrix();
ccVertex2F* verts = new ccVertex2F[count];
for(int i=0;i<count;i++)
{
verts[i].x = vertices[i].x + spriteRect.size.width/2;//*CC_CONTENT_SCALE_FACTOR();
verts[i].y = vertices[i].y + spriteRect.size.height/2;//*CC_CONTENT_SCALE_FACTOR();
}
ccTex2F* uvs = new ccTex2F[count];
float baseTexturePixelsWide = baseTexture->getPixelsWide();
float baseTexturePixelsHigh = baseTexture->getPixelsHigh();
for(int i=0;i<count;i++)
{
uvs[i].u = ((spriteRect.size.width/2 + vertices[i].x)/baseTexturePixelsWide) * CC_CONTENT_SCALE_FACTOR();
uvs[i].v = ((spriteRect.size.height/2 - vertices[i].y)/baseTexturePixelsHigh) * CC_CONTENT_SCALE_FACTOR();
}
ccGLBindTexture2D(baseTexture->getName());
mShaderProgram->setUniformLocationWith4f(mColorLocation, 1.0f, 1.0f, 1.0f, 1.0f);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uvs);
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glDrawArrays(GL_TRIANGLES, 0, count);
CC_INCREMENT_GL_DRAWS(1);
delete[] uvs;
delete[] verts;
renderTexture->end();
return renderTexture->getSprite()->getTexture();
}
Наконец Я называю эти функции в этом фрагменте кода, rockPolygon - это исходный спрайт:
//Get the seamless square texture
CCSpriteBatchNode* rockBatch = CCSpriteBatchNode::create("rock_small.png", kDefaultSpriteBatchCapacity);
//Triangulate the old sprite
vector<CCPoint> triangles = triangulateSprite(rockPolygon);
//CCTexture2D* rockTexture = textureColorWithVertices(&triangles[0], triangles.size(), rockPolygon->getOriginalRect());
CCTexture2D* rockTexture = textureWithVertices(&triangles[0], triangles.size(), rockBatch->getTexture(), rockPolygon->getOriginalRect());
CCSprite* genSprite = new CCSprite();
genSprite->initWithTexture(rockTexture);
genSprite->setPosition(ccp(200,200));
addChild(genSprite); //add generated sprite to main layer
Я проверил триангуляцию, он отлично работает. Я также удаляю весь код между renderTexture-> beginWithClear (1, 1, 1, 0); и renderTexture-> end(), установите альфа-канал в 1 beginWithClear (1, 1, 1, 1), и белый квадрат будет правильно отображаться. Поэтому я предполагаю, что проблема связана с вызовами opengl, но я не могу найти, что не так. Есть ли у вас какие-либо идеи о том, как решить эту проблему?
Я использую cocos2d-x 2.0.4 и CCDrawNode доступен с версии 2.1. Btw Я также использую стороннюю библиотеку, которая заставляет меня использовать производные классы из CCSprite для моих полигонов. Кроме того, CCDrawNode может быть заполнен бесшовной текстурой, вызывая на ней initWithTexture? В любом случае, я сделал некоторые тестовые материалы, и выше код правильно работает при вызове его из другой части моего кода. Поэтому я изучаю, что может вызвать эту проблему, но это действительно странно, один и тот же код, два разных места вызова, в одном случае он работает, а в другом - нет. Спасибо, что ответили мне :) – olma