2011-09-26 9 views
1

OpenGLで奇妙な問題があります。私は両方のiPhoneとipad用のペイントアプリケーションに取り組んでいます。私は自分のアプリにopengl-esを使っています。私のアプリでは、輪郭イメージに色を塗りつぶしていて、ユーザーが触れる場所に基づいて画面上に線を描きます。私はちょうど2つのポイントの間に線を描画する "touchesMoved"関数を使用します。私は、私のrenderLineFromPoint関数で、画面上に行を残したいと思っていますが、何らかの理由で行のいくつかの点が途切れるだけで、完全にランダムに見えます。しかし、ipadシミュレータiphoneデバイス/シミュレータは、望ましい出力を与えます。線ストロークが図のように表示されます。ipad用のペイントアプリ[opengl-es]の線ストロークが正しくありません

enter image description here

Iは、次のコード使用してバッファを作成しています。私はrenderLineFromPoint

- (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end{ 
static GLfloat*  vertexBuffer = NULL; 
static NSUInteger vertexMax = 64; 

NSUInteger   vertexCount = 0, 
        count, 
        i; 

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

// Convert locations from Points to Pixels 
//CGFloat scale = self.contentScaleFactor; 
CGFloat scale; 
if ([self respondsToSelector: @selector(contentScaleFactor)]) 
{ 

    scale=self.contentScaleFactor; 

} 
else{ 


//scale = 1.000000; 

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) { 
     // RETINA DISPLAY 

     scale = 2.000000; 
    } 
    else { 
     scale = 1.000000; 
    } 

} 


NSLog(@"start point %@", NSStringFromCGPoint(start)); 

NSLog(@"End Point %@", NSStringFromCGPoint(end)); 



start.x *= scale; 
start.y *= scale; 
end.x *= scale; 
end.y *= scale; 

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


vertexBuffer = malloc(vertexMax * 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); 

NSLog(@"count %d",count); 

for(i = 0; i < count; ++i) { 
    if(vertexCount == vertexMax) { 
     vertexMax = 2 * vertexMax; 
     vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat)); 

     NSLog(@"if loop"); 

      } 

    vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count); 
    vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count); 

    vertexCount += 1; 
} 


NSLog(@"Scale vertex %f",scale); 

//NSLog(@"%i",vertexCount); 




// Render the vertex array 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 

glDrawArrays(GL_POINTS, 0, vertexCount); 


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

}

は、次のコードスニペットを使用してい

- (BOOL)createFramebuffer{ 
// Generate IDs for a framebuffer object and a color renderbuffer 
glGenFramebuffersOES(1, &viewFramebuffer); 
glGenRenderbuffersOES(1, &viewRenderbuffer); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
// This call associates the storage for the current render buffer with the EAGLDrawable (our CAEAGLLayer) 
// allowing us to draw into a buffer that will later be rendered to screen wherever the layer is (which corresponds with our view). 

[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer]; 


glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 


NSLog(@"Backing Width:%i and Height: %i", backingWidth, backingHeight); 


// For this sample, we also need a depth buffer, so we'll create and attach one via another renderbuffer. 
glGenRenderbuffersOES(1, &depthRenderbuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
{ 
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
    return NO; 
} 

return YES; 

}

touchbegan機能コード:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
CGRect    bounds = [self bounds]; 
UITouch* touch = [[event touchesForView:self] anyObject]; 
firstTouch = YES; 
// Convert touch point from UIView referential to OpenGL one (upside-down flip) 
location = [touch locationInView:self]; 
location.y = bounds.size.height - location.y; 

}

touchmoved機能コード:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

CGRect    bounds = [self bounds]; 
UITouch*   touch = [[event touchesForView:self] anyObject]; 

// Convert touch point from UIView referential to OpenGL one (upside-down flip) 
if (firstTouch) { 
    firstTouch = NO; 
    previousLocation = [touch previousLocationInView:self]; 
    previousLocation.y = bounds.size.height - previousLocation.y; 

} else { 
    location = [touch locationInView:self]; 
    location.y = bounds.size.height - location.y; 
    previousLocation = [touch previousLocationInView:self]; 
    previousLocation.y = bounds.size.height - previousLocation.y; 
} 

// Render the stroke 
[self renderLineFromPoint:previousLocation toPoint:location]; 

}

答えて

0

私は行方不明のポイントで同様の問題を持っていたし、それはのdrawableProprtiesに関連していました私のCAEAGLLayer。

CAEAGLLayerのdrawableProperties内で、kEAGLDrawablePropertyRetainedBackingをYESに設定していますか?そうでない場合は、図面のバッキングがフレーム間で保持されないため、ポイントやちらつきが発生する可能性があります。

+0

返信ありがとうございましたが、私はkEAGLDrawablePropertyRetainedBackingをYESに設定しました。この欠点の問題は、CAEaglelayerのサイズを変更するときに発生します。レイヤ768x768の幅nの高さを適切に設定しても、768を超えて高さを上げると768x769となり、スクリーンショットに示すように何かが表示されます。なぜそれが起こっているのかご存じですか? – user392406

+0

CAEAGLLayerが768x768として起動し、描画が発生した後にCAEAGLLayerを768x768 + nに増やすと問題が発生しますか?または、それを768x768 + nに初期化すると問題が発生しますか? – robhasacamera

+0

CAEagleLayerを768x768 + nに初期化すると問題が発生します。 – user392406