2013-02-21 8 views
0

У меня есть вогнутый многоугольник. Первое, что я делаю, это триангулировать его и хранить все точки треугольника в массиве вершин. Я пытаюсь заполнить этот многоугольник текстурой или цветом, но ни одно из двух решений не работает.Заполните многоугольник с текстурой/цветом, используя 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, но я не могу найти, что не так. Есть ли у вас какие-либо идеи о том, как решить эту проблему?

ответ

1

Вы уже находитесь на cocos2d 2.x. Ваша триангуляция до выпуклых форм работает. Затем вы можете рисовать фигуры с CCDrawNode, не нужно писать свой собственный код визуализации.

+0

Я использую cocos2d-x 2.0.4 и CCDrawNode доступен с версии 2.1. Btw Я также использую стороннюю библиотеку, которая заставляет меня использовать производные классы из CCSprite для моих полигонов. Кроме того, CCDrawNode может быть заполнен бесшовной текстурой, вызывая на ней initWithTexture? В любом случае, я сделал некоторые тестовые материалы, и выше код правильно работает при вызове его из другой части моего кода. Поэтому я изучаю, что может вызвать эту проблему, но это действительно странно, один и тот же код, два разных места вызова, в одном случае он работает, а в другом - нет. Спасибо, что ответили мне :) – olma

Смежные вопросы