Opengl 使用CCRenderTexture使用纹理/颜色填充多边形

Opengl 使用CCRenderTexture使用纹理/颜色填充多边形,opengl,textures,cocos2d-x,Opengl,Textures,Cocos2d X,我有一个凹多边形。我要做的第一件事是对它进行三角化,并将所有三角形点存储在顶点数组中。 我试图用纹理或颜色填充多边形,但这两种解决方案都不起作用 以下是尝试使用一种颜色获取纹理时的代码: CCTexture2D* TextureTest::textureColorWithVertices(CCPoint* vertices, int count,

我有一个凹多边形。我要做的第一件事是对它进行三角化,并将所有三角形点存储在顶点数组中。 我试图用纹理或颜色填充多边形,但这两种解决方案都不起作用

以下是尝试使用一种颜色获取纹理时的代码:

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();
CCTexture2D*TextureTest::TextureColor带顶点(CCPoint*顶点,
整数计数,
CCRect SPRITECT)
{
CCRenderTexture*renderTexture=CCRenderTexture::create(spriteRect.size.width,spriteRect.size.height);
renderTexture->beginWithClear(1,1,1,0);
mShaderProgram->use();
mShaderProgram->setUniformForModelViewProjectionMatrix();
ccVertex2F*verts=新的ccVertex2F[计数];
对于(int i=0;具有4F的IsetuniformLocation(mColorLocation,1.0f,1.0f,1.0f,1.0f);
glVertexAttribPointer(kCCVertexAttrib_位置,2,GL_浮动,GL_假,0,顶点);
glVertexAttribPointer(kCCVertexAttrib_颜色,4,GL_浮动,GL_假,0,颜色);
gldrawArray(GL_三角形,0,计数);
glEnable(GL_纹理_2D);
CC_增量_GL_图纸(1);
删除[]种颜色;
删除[]个顶点;
renderTexture->end();
返回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();
 }
CCTexture2D*TextureTest::textureWithVertices(CCPoint*顶点,
整数计数,
CCTexture2D*基本纹理,
CCRect SPRITECT)
{    
CCRenderTexture*renderTexture=CCRenderTexture::create(spriteRect.size.width,spriteRect.size.height);
renderTexture->beginWithClear(1,1,1,0);
mShaderProgram->use();
mShaderProgram->setUniformForModelViewProjectionMatrix();
ccVertex2F*verts=新的ccVertex2F[计数];
for(int i=0;igetPixelsWide();
float baseTexturePixelsHigh=baseTexture->getPixelsHigh();
for(int i=0;igetName());
mShaderProgram->setUniformLocationWith4f(mColorLocation,1.0f,1.0f,1.0f,1.0f);
glvertexattributepointer(kCCVertexAttrib_TexCoords,2,GL_FLOAT,GL_FALSE,0,uvs);
glVertexAttribPointer(kCCVertexAttrib_位置,2,GL_浮动,GL_假,0,顶点);
glTexParameteri(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_重复);
gldrawArray(GL_三角形,0,计数);
CC_增量_GL_图纸(1);
删除[]个UV;
删除[]个顶点;
renderTexture->end();
返回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
//获得无缝方形纹理
CCSpriteBatchNode*rockBatch=CCSpriteBatchNode::create(“rock_small.png”,kDefaultSpriteBatchCapacity);
//三角化老精灵
矢量三角形=三角形(岩石多边形);
//CCTexture2D*rockTexture=TextureColor带顶点(&triangles[0],triangles.size(),rockPolygon->getOriginalRect());
CCTexture2D*rockTexture=textureWithVertices(&triangles[0],triangles.size(),rockBatch->getTexture(),rockPolygon->getOriginalRect());
CCSprite*genSprite=新的CCSprite();
genSprite->initWithTexture(岩石纹理);
发电机->设定位置(ccp(200200));
addChild(genSprite);//将生成的精灵添加到主层

我检查了三角剖分,效果很好。我还删除了renderTexture->beginWithClear(1,1,1,0)和renderTexture->end()之间的所有代码,将alpha通道设置为1 beginWithClear(1,1,1,1)并且一个白色正方形正确显示。因此,我猜问题来自opengl调用,但我找不到问题所在。您知道如何解决此问题吗?

您已经使用cocos2d 2.x。您对凸面形状的三角剖分工作正常。然后您可以使用CCDrawNode绘制形状,无需编写自己的渲染代码

实际上,我使用的是cocos2d-x 2.0.4,CCDrawNode从2.1开始就可以使用。顺便说一句,我还使用了第三方库,强制我为多边形使用来自CCSprite的派生类。此外,CCDrawNode是否可以通过调用initWithTexture用无缝纹理填充?无论如何,我做了一些测试,上面的代码在n从我的代码的另一部分调用它。因此我正在调查导致此问题的原因,但这真的很奇怪,相同的代码,两个不同的调用位置,在一种情况下有效,在另一种情况下无效。谢谢回答我:)