2012-04-11 17 views
2

iPhoneやiPad用のペイントアプリ[GLPaintアプリからのリファレンス]を開発中です。 私はブラシ効果に取り組んでいます。私はブラシテクスチャのために、次のコードを使用しています2iPhone OpenGL ESペイントアプリブラシエフェクト

enter image description here

画像に類似したブラシストロークを持って

enter image description here

画像1に示したように、私は私のペイントアプリ用ブラシ効果を取得したいです:

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

私はさまざまなペイントブラシストロークに関連するコードを検索していましたが、コードは見つかりませんでした。 image1に似た「希望の」ブラシストロークを得るのを手伝ってください。

答えて

0

GL_POINT_SPRITE_OESモードを使用しないでください。標準的な三角形でスプライトを描画します。次に、スプ​​ライトテクスチャ座標をターゲット出力座標にバインドし、スプライトテクスチャを繰り返し実行できるようにする必要があります。 スプライトのテクスチャサイズが32x32であると仮定します。デフォルトのテクスチャ座標は矩形{{0,0},{1.0,1.0}}です。スプライトを{x,y}位置に描画するには、矩形{{(x%32)/32.0, (y%32)/32.0},{1.0, 1.0}}に基づくスプライトテクスチャ座標を使用する必要があります。これにより、スプライトの内容が汚れてしまうのを防ぎます。

関連する問題