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从我的代码的另一部分调用它。因此我正在调查导致此问题的原因,但这真的很奇怪,相同的代码,两个不同的调用位置,在一种情况下有效,在另一种情况下无效。谢谢回答我:)