Jump to content

  • Log In with Google      Sign In   
  • Create Account

PaulCaben

Member Since 01 Jul 2012
Offline Last Active Jul 10 2012 05:22 AM

Topics I've Started

Texture image replaced by a "number" ?

09 July 2012 - 11:35 AM

Hi,

I am confused about what i get from my texture :

Attached File  Capture d’écran 2012-07-09 à 19.30.45.png   23.46KB   36 downloads


I followed this great tutorial about texturing, and i have tried to re-use the code with a png image (512x512). Here is the code i am using :

I created a texture from a call in the init method, then i called showTexture in the "draw" method to draw the texture :

-(void)showTexture{

   static const GLfloat texCoords[] = {
	   0.0, 1.0,
	   1.0, 1.0,
	   0.0, 0.0,
	   1.0, 0.0
   };

   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
   glTexCoordPointer(2, GL_FLOAT, 0, texCoords);

   //glDisableClientState(GL_VERTEX_ARRAY);
   //glDisableClientState(GL_NORMAL_ARRAY);
   glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

- (void) draw {
   //...
   glEnable(GL_TEXTURE_2D);
   glDisableClientState(GL_COLOR_ARRAY);
   glVertexPointer(2, GL_FLOAT, 0, _polyVertices);
   glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)_nPolyVertices);

   [self showTexture];

}

-(void)initTexture{
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_BLEND);
   glBlendFunc(GL_ONE, GL_SRC_COLOR);

   GLuint texture[1];
   glGenTextures(1, &texture[0]);
   glBindTexture(GL_TEXTURE_2D, texture[0]);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

   NSString *path = [[NSBundle mainBundle] pathForResource:@"brown" ofType:@"png"];
   NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
   UIImage *image = [[UIImage alloc] initWithData:texData];
   if (image == nil)
	   NSLog(@"Do real error checking here");

   GLuint width = CGImageGetWidth(image.CGImage);
   GLuint height = CGImageGetHeight(image.CGImage);
   CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
   void *imageData = malloc( height * width * 4 );
   CGContextRef context = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
   CGColorSpaceRelease( colorSpace );
   CGContextClearRect( context, CGRectMake( 0, 0, width, height ) );
   CGContextTranslateCTM( context, 0, height - height );
   CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image.CGImage );

   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

   CGContextRelease(context);

   free(imageData);
   [image release];
   [texData release];
}


- (id)init {
   if ((self = [super init])) {
	   //...
	   [self initTexture];
   }
   return self;
}


Thanks for your help

Why this issue about a point coordinates?

05 July 2012 - 07:39 PM

I would like to connect the points from the red path, to the y-axis in blue. I figured out that the problem with my triangles came from the first point (V0) : it is not located where it should be.

In the console, it says its location is at 0,0, but in the emulator, it is not.

Edit: ok i figured it out, a simple issue about where the variable was defined. Thanks anyway

Why do i get stripes instead of a plain color? (in a defined area)

01 July 2012 - 06:37 PM

Hi,

I'm just starting with OpenGL, I would like to fill an area with a plain color, but i always get "stripes" inside this area. Would someone know how to fill it with a simple plain color? I put some pictures attached to this post :

At first :

Attached File  Capture d’écran 2012-07-02 à 02.18.16.png   7.54KB   30 downloads

After i click once (it calls genBackground again, the unwanted stripes appear :
Attached File  Capture d’écran 2012-07-02 à 02.18.25.png   17.88KB   38 downloads

Same thing after another click :

Attached File  Capture d’écran 2012-07-02 à 02.18.38.png   17.84KB   41 downloads



Here is the code :

Terrain is the area where to draw the plain color :

#import "Terrain.h"
#import "HelloWorldLayer.h"
@implementation Terrain
@synthesize textureImage = _textureImage;
- (ccColor4F)randomBrightColor {
	while (true) {
		float requiredBrightness = 192;
		ccColor4B randomColor =
		ccc4(arc4random() % 255,
			 arc4random() % 255,
			 arc4random() % 255,
			 255);
		if (randomColor.r > requiredBrightness ||
			randomColor.g > requiredBrightness ||
			randomColor.b > requiredBrightness) {
			return ccc4FFromccc4B(randomColor);
		}	  
	}
  
}
- (void)generateVertices {
  
	_hillVertices[_nHillVertices] = CGPointMake(0, 0);
	_hillTexCoords[_nHillVertices++] = CGPointMake(0, 0);
  
	_hillVertices[_nHillVertices] = CGPointMake(100, 50);
	_hillTexCoords[_nHillVertices++] = CGPointMake(100, 50);
  
	_hillVertices[_nHillVertices] = CGPointMake(150, 200);
	_hillTexCoords[_nHillVertices++] = CGPointMake(150, 200);
  
	_hillVertices[_nHillVertices] = CGPointMake(100, 300);
	_hillTexCoords[_nHillVertices++] = CGPointMake(100, 300);
}

- (id)init {
	if ((self = [super init])) {
		[self generateVertices];
	}
	return self;
}
- (void) draw {
	glBindTexture(GL_TEXTURE_2D, _textureImage.texture.name);
	glDisableClientState(GL_COLOR_ARRAY);
  
	glColor4f(1, 1, 1, 1);
	glVertexPointer(2, GL_FLOAT, 0, _hillVertices);
	glTexCoordPointer(2, GL_FLOAT, 0, _hillTexCoords);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)_nHillVertices);
  
}

and this is the "HelloWorldLayer", where i set the background and the textureImage color :

-(CCSprite *)spriteWithColor:(ccColor4F)bgColor textureSize:(float)textureSize {
  
	// 1: Create new CCRenderTexture
	CCRenderTexture *rt = [CCRenderTexture renderTextureWithWidth:textureSize height:textureSize];
  
	// 2: Call CCRenderTexture:begin
	[rt beginWithClear:bgColor.r g:bgColor.g b:bgColor.b a:bgColor.a];
  
	// 3: Draw into the texture
	glDisable(GL_TEXTURE_2D);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  
	float gradientAlpha = 0.7;  
	CGPoint vertices[4];
	ccColor4F colors[4];
	int nVertices = 0;
  
	vertices[nVertices] = CGPointMake(0, 0);
	colors[nVertices++] = (ccColor4F){0, 0, 0, 0 };
	vertices[nVertices] = CGPointMake(textureSize, 0);
	colors[nVertices++] = (ccColor4F){0, 0, 0, 0};
	vertices[nVertices] = CGPointMake(0, textureSize);
	colors[nVertices++] = (ccColor4F){0, 0, 0, gradientAlpha};
	vertices[nVertices] = CGPointMake(textureSize, textureSize);
	colors[nVertices++] = (ccColor4F){0, 0, 0, gradientAlpha};
  
	glVertexPointer(2, GL_FLOAT, 0, vertices);
	glColorPointer(4, GL_FLOAT, 0, colors);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)nVertices);
  
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnable(GL_TEXTURE_2D);
  
	CCSprite *noise = [CCSprite spriteWithFile:@"Noise.png"];
	[noise setBlendFunc:(ccBlendFunc){GL_DST_COLOR, GL_ZERO}];
	noise.position = ccp(textureSize/2, textureSize/2);
	[noise visit];
  
	// 4: Call CCRenderTexture:end
	[rt end];
  
	// 5: Create a new Sprite from the texture
	return [CCSprite spriteWithTexture:rt.sprite.texture];
  
}
- (void)genBackground {
  
	[_background removeFromParentAndCleanup:YES];
  
	ccColor4F bgColor = [self randomBrightColor];
	_background = [self spriteWithColor:bgColor textureSize:512];
  
	CGSize winSize = [CCDirector sharedDirector].winSize;
	_background.position = ccp(winSize.width/2, winSize.height/2);	  
	ccTexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
	[_background.texture setTexParameters:&tp];
  
	[self addChild:_background];
  
	ccColor4F color3 = [self randomBrightColor];
	CCSprite *textureImage = [self spriteWithColor:color3 textureSize:512];
	//ccTexParams tp2 = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
	//[stripes.texture setTexParameters:&tp2];
	_terrain.textureImage = textureImage;
  
}

Thanks for your help

PARTNERS