2010-10-29 18 views
8

Là một phần của việc sửa đổi GLPaint, tôi đang cố gắng thêm chức năng xóa nơi người dùng có thể chọn nút tẩy và xóa khu vực được sơn giống như vẽ.Xóa bằng cọ trong GLPaint

Tôi đang cố gắng có câu lệnh có điều kiện trong phương pháp "renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end" để tôi có thể kiểm tra xem đột quỵ có dùng để vẽ hoặc xóa không.

Để xóa, tôi không biết cách sử dụng các tham số "start" và "end" để xóa. Có bất kỳ cuộc gọi phương thức nào trong OpenGL như glClear() chấp nhận hai tham số này và không xóa?

Mọi con trỏ sẽ rất hữu ích. Cảm ơn bạn.

+0

Có khả thi không? – blacky

+0

vâng, câu trả lời được đưa ra bởi zlog hoạt động trong ứng dụng vẽ của tôi – thgc

Trả lời

9

Dọc theo tĩnh mạch giống như Erase using brush in GLPaint, bạn có thể tái sử dụng các phương pháp

- (void)renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end 

bằng việc có điều kiện:

if (isEraserBrushType) { 
    glBlendFunc(GL_ONE, GL_ZERO); 
    glColor4f(0, 0, 0, 0.0); 
} else { 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    [self setBrushColorWithRed:brushColourRed green:brushColourGreen blue:brushColourBlue]; 
} 

trên mã:

// Render the vertex array 
glVertexPointer(2, GL_FLOAT, 0, eraseBuffer); 
glDrawArrays(GL_POINTS, 0, vertexCount); 

Lưu ý, bạn' sẽ cần phải thực hiện isEraserBrushType, và lưu trữ brushColourRed, brushColourGreen và brushColourBl ue bằng cách nào đó.

+1

nó xóa bằng cọ hình chữ nhật (tôi nghĩ kích thước hình ảnh brush - 64/64), không phải với hình ảnh bàn chải hiện tại. bất kỳ ý tưởng tại sao là điều đó? –

+0

Tôi đoán đó là lý do tại sao đây không phải là câu trả lời được chấp nhận. @zlog Tôi cũng muốn biết điều này. Bất kỳ ý tưởng làm thế nào để xóa với hình ảnh bàn chải, không phải là hộp viền bàn chải? – taber

+4

chỉ tìm thấy bài đăng này: http: // stackoverflow.com/questions/4074955/blending-a-texture-to-erase-alpha-values-softly-with-opengl bằng cách sử dụng 'glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA)' dường như làm điều này. – taber

4

Tôi nghĩ rằng tôi có thể giải quyết vấn đề này, mặc dù không phải là rất tốt.

Bạn có thể tạo bản sao chức năng mới của "renderLineFromPoint", như thế này;

- (void) drawErase:(CGPoint)start toPoint:(CGPoint)end 
{ 
    static GLfloat*  eraseBuffer = NULL; 
    static NSUInteger eraseMax = 64; 

    NSUInteger   vertexCount = 0, 
    count, 
    i; 

    [EAGLContext setCurrentContext:context]; 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

    // Convert locations from Points to Pixels 
    CGFloat scale = 1.0;//self.contentScaleFactor; 
    start.x *= scale; 
    start.y *= scale; 
    end.x *= scale; 
    end.y *= scale; 

    // Allocate vertex array buffer 
    if(eraseBuffer == NULL) 
     eraseBuffer = malloc(eraseMax * 2 * sizeof(GLfloat)); 

    // Add points to the buffer so there are drawing points every X pixels  
    count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y))/kBrushPixelStep), 1); 

    for(i = 0; i < count; ++i) { 
     if(vertexCount == eraseMax) { 
      eraseMax = 2 * eraseMax; 
      eraseBuffer = realloc(eraseBuffer, eraseMax * 2 * sizeof(GLfloat)); 
     } 

     eraseBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count); 
     eraseBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count); 
     vertexCount += 1; 
    } 
    //} 
    //glEnable(GL_BLEND); // 打开混合 
     //glDisable(GL_DEPTH_TEST); // 关闭深度测试 
     //glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数 

     //You need set the mixed-mode 
    glBlendFunc(GL_ONE, GL_ZERO); 
     //the erase brush color is transparent. 
    glColor4f(0, 0, 0, 0.0); 

    // Render the vertex array 
    glVertexPointer(2, GL_FLOAT, 0, eraseBuffer); 
    glDrawArrays(GL_POINTS, 0, vertexCount); 

    // Display the buffer 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

     // at last restore the mixed-mode 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
} 

Tiếng Anh của tôi kém. Bạn có hiểu những gì tôi nói không? Hy vọng những điều này có thể giúp bạn.

+0

Đây là câu trả lời hoàn hảo ... làm việc cho tôi .. – Heena

-2

ý tưởng khác, nếu giả sử mặt đất trở lại của quan điểm của bạn là màu đen bạn chỉ có thể gọi [self setBrushColorWithRed:0.0 green:0.0 blue:0.0] và sau đó gọi renderPoint: ToPint: - Đây sẽ vẽ màu đen (và người dùng có thể nghĩ rằng ông đang thực sự xóa

0
.

tôi cố gắng sử dụng các câu trả lời được chấp nhận, tuy nhiên nó sẽ xóa trong một mô hình vuông, trong khi tôi muốn xóa sử dụng bàn chải của riêng tôi. Thay vào đó tôi đã sử dụng một chức năng hòa trộn khác nhau.

if (self.isErasing) { 
    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); 
    [self setBrushColorWithRed:0 green:0 blue:0]; 
} else { 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
} 

cách làm việc này là các màu (nguồn) đến được nhân với số không đến c hoàn toàn biến mất có nghĩa là bạn không thực sự vẽ bất kỳ thứ gì mới. Sau đó, màu đích được đặt thành (1 - Source Alpha). Vì vậy, bất cứ nơi nào bàn chải có màu đích có không có màu.

Các vấn đề liên quan