2012-07-05 16 views
7

私はペイントプログラムを作った。期待どおりにすべてが機能します。しかし、絵を描いている間に、時には奇妙なことが起こることもありますglDrawArraysが正しく描画されない

アプリを起動し、画像上で左マウスボタンを押します。コードからポイントを引く必要があります:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, brushTextura); 
glPointSize(100); 
glVertexPointer(2, GL_FLOAT, 0,GLVertices); 
glDrawArrays(GL_POINTS, 0, count); 
glDisableClientState(GL_VERTEX_ARRAY); 

私が押すポイント。 mouseDownはmouseDownの位置を登録し、それをNSValueに変換し、配列に送信してから描画する前に、NSValueをCGPointに抽出し、glDrawArraysによって描画できるようにGLfloatに送ります。しかし、画像上のどこでマウスをクリックしても、座標(0,0)に点が描画されます。その後、すべてのものが正常に動作します。画像を参照してください:

mouse click

これが最初の問題でした。 2つめの問題は、マウスでドラッグすると、描かれていない箇所が表示されることがあることです。画像:

mouse drag

私はそれが消えドラッグを続けます。ドラッグした後に再び表示され、再び消えます。等々。画像:

enter image description here

任意のアイデアを、なぜそれが起こるのだろうか?私は怒鳴るコードを掲載します:ダウン


マウス:

- (void) mouseDown:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

マウスドラッグ:

- (void) mouseDragged:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

ドローイング:glDrawArraysへ

- (void) drawing { 
int count = [vertices count] * 2; 
NSLog(@"count: %d", count); 
int currIndex = 0; 
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat)); 
for (NSValue *locationValue in vertices) { 
    CGPoint loc = locationValue.pointValue; 
    GLVertices[currIndex++] = loc.x; 
    GLVertices[currIndex++] = loc.y;  
} 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, brushTextura); 
glPointSize(100); 
glVertexPointer(2, GL_FLOAT, 0, GLVertices); 
glDrawArrays(GL_POINTS, 0, count); 
glDisableClientState(GL_VERTEX_ARRAY); 
} 

答えて

6

あなたは奇妙に思われる、[vertices count] * 2にごcount変数(glDrawArraysで使用されるもの)を設定しています。

glDrawArraysの最後の引数は、描画する頂点の数ですが、コードでは数値を2倍に設定しているようです(たぶん、浮動小数点数だと思います)。最初のcount頂点の後。

+0

を私はそれを変更した場合は、 '[ vertices count] 'を実行すると、描画を開始するとブレークします。 OKを描画した後にいくつかの点が描画され、その後にエラーが表示されます: 'glDrawArrays(GL_POINTS、0、count);または' NSValue * locationValue = NSValue(NSValue)で 'スレッド1:EXC_BAD_ACCESS(コード= 13、アドレス= 0x0) valueWithPoint:vieta]; 'エラー'スレッド1:シグナルSIGABRT'。 1つの時間は1つのエラー、他の時間は他のエラーです。理由は分かりませんが、エラーは常に同じではありません – hockeyman

+0

時にはブレークしてコンソールにメッセージを表示します: 'OGL(896,0x7fff79c93960)malloc:***オブジェクトのエラー*** 0x100151a98:解放されたオブジェクトのチェックサムが正しくありません - オブジェクトはおそらく解放された後に変更されました。 *** malloc_error_breakにブレークポイントを設定してデバッグする ' – hockeyman

+0

@JuliusPetraškaこれはおそらくあなたが' GLVertices'の 'malloc'でも使っているので、頂点配列が小さすぎます。 (この時点ではクラッシュが発生します)。もちろん、 'GLVertices'配列は' vertex count * 2'のサイズを持たなければなりません。各頂点に2つの浮動小数点が含まれているからです。しかし、 'glDrawArrays'に完全な頂点を' [vertices count] 'だけ描かなければなりません。 –

0

の引数は、次のように定義されています( GLenumモード、GLint最初、GLsizei coun t)。

第2引数は、描画時に使用される頂点属性の最初のインデックスを定義します。頂点座標が不一致になる最初のインデックスとして1を渡しています。私はあなたがそこに0を望んでいると仮定します。

http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml

+0

関係なく、その1または0と同じrezultすべての時間 – hockeyman

1

頂点がクリックされた正確な場所にレンダリングされないという事実は、ビュー内のヒットポイントが正しく決定されていないというヒントになります。

あなたのコードがあります

location = [self convertPoint: [event locationInWindow] fromView: self]; 

ポイントは、実際のウィンドウに相対的であるにも関わらず、同じビューの座標(自己)にその座標(自己)からポイントを変換するビューを指示しています。

は、ビューにウィンドウの座標からポイントを変換するには、その行を変更するには、以下:

location = [self convertPoint: [event locationInWindow] fromView: nil]; 
関連する問題