GL_CLAMP_TO_EDGE should be used in NPOT textures

I have two images:

  • PNG (sRGB) 64x64 (downloaded from the network)
  • PNG (sRGB) ported from fla to png, then from png to jpg with sRGB, then to PNG (sRGB).

I am trying to fill a polygon with the texture created in this image:

CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:spriteName]; polygon = [[[PhisicsFilledPoligon alloc] initWithPoints:points andTexture:texture] autorelease]; 

PhysicsFilledPolygon is the PhysicsSprite type for box2d, but with an overridden draw method:

 -(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); } 

when I try to use the 1st image for texture, everything works fine. But since I use the second, the application crashes with an 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' 

Whatever image I try to use, the result is the same. Cocos2d version 2.0 rc0. Here begins the information about 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 

Where is my problem?

+6
source share
4 answers

You are using a texture with Non-Strength-Two options.

+11
source

The problem, I think, in the lines:

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

GL_REPEAT is not part of the basic OpenGL ES 2.0 specification for NPOT textures, only GL_CLAMP_TO_EDGE is, and therefore GL_REPEAT is not supported.

You need to set GL_CLAMP_TO_EDGE instead of GL_REPEAT basically or use POT textures.

+9
source

Switching GL_REPEAT to GL_CLAMP_TO_EDGE removes the error and builds again in my project, but I lost the repeat effect. I had to do this after upgrading to Cocos2d 2.x. Best of all, just make your image sizes power 2 ... (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048).

+2
source

Magic words: CCConfiguration.m: // around line 122

 supportsNPOT_ = NO; // before it said YES 
0
source

Source: https://habr.com/ru/post/916076/


All Articles