CGContext dans NSOpenGlContext
Chacha
Membre
Bon, ça va ressembler à une grosse question imbittable, mais je tente ma chance.
Voilà : j'aimerais me faire une petite appli pour ajouter un filtre en temps réel sur une video. J'ai donc repris le code de "CIVideoDemo GL" dans les examples Developer.
Dans ce code, tout se passe dans un contexte opengl.
Pour commencer doucement, j'ai juste essayé de rajouter le tracé d'un CGRect dans le drawRect: de la NSOpenGlView principale.
Sauf que pour tracer un CGRect, il faut un CGContextRef, ce qui n'est pas le cas dans un contexte OpenGL.
J'ai donc fait ça :
Bon, ça ne trace rien du tout.
Je vous livre le drawRect en entier:
Voilà : j'aimerais me faire une petite appli pour ajouter un filtre en temps réel sur une video. J'ai donc repris le code de "CIVideoDemo GL" dans les examples Developer.
Dans ce code, tout se passe dans un contexte opengl.
Pour commencer doucement, j'ai juste essayé de rajouter le tracé d'un CGRect dans le drawRect: de la NSOpenGlView principale.
Sauf que pour tracer un CGRect, il faut un CGContextRef, ce qui n'est pas le cas dans un contexte OpenGL.
J'ai donc fait ça :
<br />//il existe dans le code un ciContext permettant d'utiliser CoreImage<br /><br />//je crée une CGLayer<br />CGLayerRef cgLayer = [ciContext createCGLayerWithSize:CGSizeMake(frame.size.width, frame.size.height) info:NULL];<br /><br />//j'en sors un CGcontext<br />CGContextRef context = CGLayerGetContext(cgLayer);<br /><br />//je trace mon rectangle<br />CGContextSetRGBFillColor(context, 1, 0, 0, .5);<br />CGContextFillRect(context, CGRectMake(100, 100, 200, 200));<br />CGContextFlush(context);<br />CGLayerRelease(cgLayer);<br />
Bon, ça ne trace rien du tout.
Je vous livre le drawRect en entier:
<br />- (void)drawRect:(NSRect)theRect<br />{<br /> //le code qui suit est d'origine<br /> [lock lock];  <br /><br /> NSRect frame = [self frame];<br /> NSRect bounds = [self bounds];<br />  <br /> [[self openGLContext] makeCurrentContext];<br /> if(needsReshape)<br /> {<br />  GLfloat minX, minY, maxX, maxY;<br /><br />  minX = NSMinX(bounds);<br />  minY = NSMinY(bounds);<br />  maxX = NSMaxX(bounds);<br />  maxY = NSMaxY(bounds);<br /><br />  [self update]; <br /><br />  if(NSIsEmptyRect([self visibleRect])) <br /> glViewport(0, 0, 1, 1);<br />  else<br />   glViewport(0, 0, frame.size.width ,frame.size.height);<br /><br />  glMatrixMode(GL_MODELVIEW);<br />  glLoadIdentity();<br />  glMatrixMode(GL_PROJECTION);<br />  glLoadIdentity();<br />  glOrtho(minX, maxX, minY, maxY, -1.0, 1.0);<br /><br />  needsReshape = NO;<br /> }<br /> glClearColor(0.0, 0.0, 0.0, 0.0);<br /> glClear(GL_COLOR_BUFFER_BIT);<br /> if(!currentFrame)<br />  [self updateCurrentFrame];<br /><br /> //début du code à moi<br /> //[self renderCurrentFrame];//je désactive l'affichage originel du film<br /> <br /> //je trace mon rectangle<br /> CGLayerRef cgLayer = [ciContext createCGLayerWithSize:CGSizeMake(frame.size.width, frame.size.height) info:NULL];<br /> CGContextRef context = CGLayerGetContext(cgLayer);<br /> CGContextSetRGBFillColor(context, 1, 0, 0, .5);<br /> CGContextSetRGBStrokeColor(context, 1, 0, 0, .5);<br /> CGContextFillRect(context, CGRectMake(100, 100, 200, 200));<br /> CGLayerRelease(cgLayer);<br /><br /> //le code qui suit est d'origine  <br /> glFlush();<br /><br /> [lock unlock];<br />}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En fait je dois récupérer autrement mon contexte :
+
Chacha