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(),將alpha通道設置爲1 beginWithClear(1,1,1,1),並且白色方塊正確顯示。所以我想這個問題來自於opengl調用,但我找不到什麼錯誤。你對如何解決這個問題有什麼想法嗎?
實際上我使用的是cocos2d-x 2.0.4,CCDrawNode自2.1版開始可用。順便說一句,我也使用第三方庫迫使我使用從CCSprite的派生類爲我的多邊形。此外,CCDrawNode可以通過調用initWithTexture來填充無縫紋理嗎?無論如何,我做了一些測試的東西,上面的代碼正確工作時,從我的代碼的另一部分調用它。所以我正在調查什麼會導致這個問題,但這真的很奇怪,相同的代碼,兩個不同的調用位置,在一種情況下它的工作原理,而另一種則不然。謝謝你回答:) – olma 2013-02-24 10:14:30