2012-05-18 11 views
6

Tengo dos imágenes:GL_CLAMP_TO_EDGE debe ser utilizado en texturas NPOT

  1. PNG (sRGB) 64x64 (descargado de la red)
  2. PNG (sRGB), portado desde fla a png, a continuación, de PNG a jpg con sRGB, luego a PNG (sRGB).

que estoy tratando de llenar polígono con textura, creado a partir de esta imagen:

CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:spriteName]; 

    polygon = [[[PhisicsFilledPoligon alloc] initWithPoints:points 
         andTexture:texture] autorelease]; 

PhysicsFilledPolygon es una especie de PhysicsSprite para box2d, pero con overrided método 'draw':

-(void) draw 
{ 
    ccGLBindTexture2D([self.texture name]); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords); 

    [prog use]; 
    [prog setUniformForModelViewProjectionMatrix]; 

    glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, sizeof(CGPoint), areaTrianglePoints); 
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(CGPoint), textureCoordinates); 

    glDrawArrays(GL_TRIANGLES, 0, areaTrianglePointCount); 
} 

cuando estoy tratando de usar la primera imagen para la textura, todo funciona bien. Pero ya que estoy usando un segundo, aplicación falla con el error:

*** Assertion failure in -[CCTexture2D setTexParameters:], /Users/SentineL/Documents/squirrels ios/squirrels/libs/cocos2d/CCTexture2D.m:743 
2012-05-18 14:42:26.603 squirrels[21436:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'GL_CLAMP_TO_EDGE should be used in NPOT textures' 

Cualquiera que sea la imagen que estoy tratando de utilizar, resultado es el mismo error. La versión Cocos2d es 2.0 rc0. Aquí está comenzando la información de cocos2d:

2012-05-18 14:42:25.038 squirrels[21436:707] cocos2d: OS version: 5.1 (0x05010000) 
2012-05-18 14:42:25.041 squirrels[21436:707] cocos2d: GL_VENDOR: Imagination Technologies 
2012-05-18 14:42:25.042 squirrels[21436:707] cocos2d: GL_RENDERER: PowerVR SGX 543 
2012-05-18 14:42:25.044 squirrels[21436:707] cocos2d: GL_VERSION: OpenGL ES 2.0 IMGSGX543-63.24 
2012-05-18 14:42:25.047 squirrels[21436:707] cocos2d: GL_MAX_TEXTURE_SIZE: 4096 
2012-05-18 14:42:25.048 squirrels[21436:707] cocos2d: GL_MAX_TEXTURE_UNITS: 8 
2012-05-18 14:42:25.049 squirrels[21436:707] cocos2d: GL_MAX_SAMPLES: 4 
2012-05-18 14:42:25.051 squirrels[21436:707] cocos2d: GL supports PVRTC: YES 
2012-05-18 14:42:25.053 squirrels[21436:707] cocos2d: GL supports BGRA8888 textures: YES 
2012-05-18 14:42:25.054 squirrels[21436:707] cocos2d: GL supports NPOT textures: YES 
2012-05-18 14:42:25.056 squirrels[21436:707] cocos2d: GL supports discard_framebuffer: YES 
2012-05-18 14:42:25.057 squirrels[21436:707] cocos2d: compiled with Profiling Support: NO 

2012-05-18 14:42:25.059 squirrels[21436:707] cocos2d: **** WARNING **** CC_ENABLE_GL_STATE_CACHE is disabled. To improve performance, enable it by editing ccConfig.h 

2012-05-18 14:42:25.061 squirrels[21436:707] cocos2d: cocos2d v2.0.0-rc0 
2012-05-18 14:42:25.063 squirrels[21436:707] cocos2d: Using Director Type:CCDirectorDisplayLink 
2012-05-18 14:42:25:201 squirrels[21436:707] Retina Display Not supported 
2012-05-18 14:42:25.214 squirrels[21436:707] cocos2d: animation started with frame interval: 60.00 
2012-05-18 14:42:25.234 squirrels[21436:707] cocos2d: surface size: 1024x768 

¿Dónde está mi problema?

+0

¿cómo puedo ejecutar 64X47 y otra imagen en mi proyecto ...? – ilesh

Respuesta

11

Está utilizando textura con dimensiones de dos dimensiones.

9

El problema, creo, es en las líneas:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

GL_REPEAT no es parte del núcleo de OpenGL ES spec 2.0 para texturas NPOT, solamente GL_CLAMP_TO_EDGE es, y por lo tanto GL_REPEAT no es compatible.

Deberá establecer GL_CLAMP_TO_EDGE en lugar de GL_REPEAT básicamente, o usar texturas POT.

2

Al cambiar GL_REPEAT a GL_CLAMP_TO_EDGE elimina el error y se genera de nuevo en mi proyecto, pero perdí el efecto de repetición. Tuve que hacer esto luego de actualizar a Cocos2d 2.x. La mejor apuesta, simplemente haga que las dimensiones de su imagen sean una Potencia de 2 ... (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048)

0

Las palabras mágicas son: CCConfiguration. m: // alrededor de la línea 122

supportsNPOT_ = NO; // before it said YES 
Cuestiones relacionadas