2012-04-11 12 views
2

Ich entwickle eine Mal-App [unter Bezugnahme auf die GLPaint App] für iPhone und iPad. Ich arbeite am Pinseleffekt. Ich mag Pinsel Effekt für meine Farbe app erhalten, wie in Image1iPhone OpenGL ES Paint App Brush Effect

enter image description here gezeigt

I Pinselstrich ähnlich wie Bild 2

enter image description here

ich für Pinsel Textur bin mit folgendem Code habe :

CGImageRef  brushImage; 
CGContextRef brushContext; 
GLubyte   *brushData; 
size_t   width, height; 
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     brushImage = [UIImage imageNamed:@"[email protected]"].CGImage; 
    } 
    else { 
     brushImage = [UIImage imageNamed:@"flower.png"].CGImage; 
    } 
    width = CGImageGetWidth(brushImage) ; 
    height = CGImageGetHeight(brushImage) ; 
    if(brushImage) { 

     brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte)); 
       brushContext = CGBitmapContextCreate(brushData, width, height, 8, width * 4, CGImageGetColorSpace(brushImage),kCGImageAlphaPremultipliedLast); 
     CGContextDrawImage(brushContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), brushImage); 
     CGContextRelease(brushContext); 
     glGenTextures(1, &brushTexture); 
     glBindTexture(GL_TEXTURE_2D, brushTexture); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData); 
     free(brushData); 
    } 
     CGFloat scale; 
     scale = self.contentScaleFactor; 

    glMatrixMode(GL_PROJECTION); 
    CGRect frame = self.bounds; 
    glLoadIdentity(); 
    glOrthof(0, (frame.size.width) * scale, 0, (frame.size.height) * scale, -1, 1); 
    glViewport(0, 0, (frame.size.width) * scale, (frame.size.height) * scale); 
    glMatrixMode(GL_MODELVIEW); 
    glDisable(GL_DITHER); 
    glEnable(GL_BLEND); 
    glEnable(GL_TEXTURE_2D); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SPRITE_OES); 
    glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 
    glPointSize(width/kBrushScale); 
    // Define a starting color 
    HSL2RGB((CGFloat) 0.0/(CGFloat)kPaletteSize, kSaturation, kLuminosity, &components[0], &components[1], &components[2]); 
    glColor4f(components[0] * kBrushOpacity, components[1] * kBrushOpacity, components[2] * kBrushOpacity, kBrushOpacity); 

Ich habe nach Code gesucht, der sich auf verschiedene Pinselstriche bezieht, aber ich kann keinen Code finden. Hilf mir, den "gewünschten" Pinselstrich zu erhalten, ähnlich wie bei image1.

Antwort

0

Verwenden Sie nicht GL_POINT_SPRITE_OES Modus. Zeichne Sprites über Standarddreiecke. Dann muss es die Sprite-Textur-Coords an die Ziel-Output-Coords binden und die Sprite-Textur wiederholbar machen. Angenommen, Sprite-Texturgröße ist 32x32. Der voreingestellte Texture Coords ist in rect {{0,0},{1.0,1.0}}. Um das Sprite unter der Position {x,y} zu zeichnen, muss die Sprite-Textur-Koordi- nation basierend auf rect {{(x%32)/32.0, (y%32)/32.0},{1.0, 1.0}} verwendet werden. Auf diese Weise wird verhindert, dass Sprite-Inhalte verschmieren.