Je suis tombé sur ce qui semblait être un problème très simple, mais j'ai passé de nombreuses heures à essayer de comprendre et de ne pas trouver de solution.Comment puis-je ajuster la teinte pour plusieurs UIImageVIews sur l'iPhone?
Je travaille avec l'exemple de code GLImageProcessing d'Apple et l'ai simplifié pour afficher un EAGLView avec un UISlider qui ajuste la teinte d'une image. J'ai modifié EAGLView pour hériter de UIImageView afin que je puisse avoir un peu plus de contrôle sur l'image affichée. Cela fonctionne bien. Le problème vient quand j'essaye d'ajouter une deuxième image à l'écran. Idéalement, j'aimerais avoir une image de fond et plusieurs autres images affichées et que le curseur de teinte change simultanément la teinte de chacune d'entre elles. Cependant, lorsque j'essaie d'ajouter une deuxième image à l'écran, la première image devient une simple vue en noir et devient une ombre de violet lorsque je bouge le curseur, mais je ne réponds pas. La nouvelle vue fonctionne comme prévu. Si je devais ajouter un troisième, les deux premiers seraient non fonctionnels, et le troisième fonctionnerait correctement.
Je pense que ce que je veux faire est d'avoir un EAGLView et d'ajouter des textures pour les nouvelles images, mais rien ne semble fonctionner. Toute aide pour me diriger dans la bonne direction serait très appréciée. Merci!
De ViewController.h. Code pour ajouter une nouvelle sous-vue EAGLView dans la méthode viewDidLoad. Il y a déjà une autre vue chargée de la pointe:
- (void)viewDidLoad
{
UIImage *img = [UIImage imageNamed:@"Image.png"];
EAGLView *newView = [[EAGLView alloc] initWithImage:img texID:0];
self.view2 = newView;
self.view2.frame = CGRectMake(110, 110, 100, 100);
[self.view addSubview:self.view2];
[newView release];
}
Et simple IBAction tiré sur la valeur modifiée:
- (void)sliderAction:(id)sender
{
[self.imageView drawViewWithSliderValue:self.slider.value];
[self.view2 drawViewWithSliderValue:self.slider.value];
}
De EAGLView.h, c'est le EAGLView code d'initialisation et le code de tirage. Il est presque le même que l'exemple de code, sauf qu'il vous permet de passer d'une image dans votre InitGL:
-(id) initializeEAGLwithTexID:(int)texID{
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context])
{
[self release];
return nil;
}
// Create system framebuffer object. The backing will be allocated in -reshapeFramebuffer
glGenFramebuffersOES(1, &viewFramebuffer[texID]);
glGenRenderbuffersOES(1, &viewRenderbuffer[texID]);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer[texID]);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer[texID]);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer[texID]);
// Perform additional one-time GL initialization
UIImage *myImage = self.image;
NSLog(@"holding image of width: %f height %f", myImage.size.width, myImage.size.height);
CGImageRef imageRef = myImage.CGImage;
initGL(imageRef, texID);
return self;
}
-(id) initWithImage:(UIImage *)image texID:(int)texID{
if((self = [super initWithImage:image])){
self.opaque = YES;
self.contentMode = UIViewContentModeScaleToFill;
[self initializeEAGLwithTexID:texID];
}
return self;
}
- (void)drawViewWithSliderValue:(float)value;
{
drawGL(backingWidth, backingHeight, value, currentID);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
De Imaging.c, le code InitGL et drawGL. J'ai modifié le code pour gérer les tableaux pour traiter plusieurs textures. Je suis relativement sûr un tas de tableaux créés ici ne sont pas nécessaires, mais comme ils ne sont pas quoi que ce soit mal, ne l'ai pas essayé d'enlever tout encore:
void initGL(CGImageRef myImage, int currID)
{
int i;
// Query renderer capabilities that affect this app's rendering paths
renderer[currID].extension[APPLE_texture_2D_limited_npot] =
(0 != strstr((char *)glGetString(GL_EXTENSIONS), "GL_APPLE_texture_2D_limited_npot"));
renderer[currID].extension[IMG_texture_format_BGRA8888] =
(0 != strstr((char *)glGetString(GL_EXTENSIONS), "GL_IMG_texture_format_BGRA8888"));
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &renderer[currID].maxTextureSize);
// Constant state for the lifetime of the app-- position and unit0 are always used
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// Load image into texture
loadTexture(myImage, &Input[currID], &renderer[currID], currID);
// Modify quad texcoords to match (possibly padded) image
for (i = 0; i < 4; i++)
{
fullquad[i].s *= Input[currID].s;
fullquad[i].t *= Input[currID].t;
flipquad[i].s *= Input[currID].s;
flipquad[i].t *= Input[currID].t;
}
// Create 1x1 for default constant texture
// To enable a texture unit, a valid texture has to be bound even if the combine modes do not access it
GLubyte half[3][4] = {{ 0x80, 0x80, 0x80, 0x80 },{ 0x80, 0x80, 0x80, 0x80 },{ 0x80, 0x80, 0x80, 0x80 }};
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &Half[currID].texID);
Half[currID].wide = Half[currID].high = 1;
Half[currID].s = Half[currID].t = 1.0;
glBindTexture(GL_TEXTURE_2D, Half[currID].texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, half[currID]);
glActiveTexture(GL_TEXTURE0);
// Remember the FBO being used for the display framebuffer
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *)&SystemFBO[currID]);
// Create scratch textures and FBOs
glGenTextures(1, &Degen[currID].texID);
Degen[currID].wide = Input[currID].wide;
Degen[currID].high = Input[currID].high;
Degen[currID].s = Input[currID].s;
Degen[currID].t = Input[currID].t;
glBindTexture(GL_TEXTURE_2D, Degen[currID].texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Degen[currID].wide, Degen[currID].high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffersOES(1, &DegenFBO[currID]);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, DegenFBO[currID]);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, Degen[currID].texID, 0);
glGenTextures(1, &Scratch[currID].texID);
Scratch[currID].wide = Input[currID].wide;
Scratch[currID].high = Input[currID].high;
Scratch[currID].s = Input[currID].s;
Scratch[currID].t = Input[currID].t;
glBindTexture(GL_TEXTURE_2D, Scratch[currID].texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Scratch[currID].wide, Scratch[currID].high, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffersOES(1, &ScratchFBO[currID]);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, ScratchFBO[currID]);
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, Scratch[currID].texID, 0);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO[currID]);
}
void drawGL(int wide, int high, float val, int currID)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, wide, 0, high, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(wide, high, 1);
glBindTexture(GL_TEXTURE_2D, Input[currID].texID);
// Render filtered image to system framebuffer
glViewport(0, 0, wide, high);
hue(flipquad, val);
}
Il semble que l'iPhone OS ne supporte qu'une seule instance d'un EAGLView. Cependant, il devrait permettre d'éditer plusieurs images, peut-être en utilisant plusieurs textures? –