私はペイントプログラムを作った。期待どおりにすべてが機能します。しかし、絵を描いている間に、時には奇妙なことが起こることもあります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)に点が描画されます。その後、すべてのものが正常に動作します。画像を参照してください:
これが最初の問題でした。 2つめの問題は、マウスでドラッグすると、描かれていない箇所が表示されることがあることです。画像:
私はそれが消えドラッグを続けます。ドラッグした後に再び表示され、再び消えます。等々。画像:
任意のアイデアを、なぜそれが起こるのだろうか?私は怒鳴るコードを掲載します:ダウン
マウス:
- (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);
}
を私はそれを変更した場合は、 '[ 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
時にはブレークしてコンソールにメッセージを表示します: 'OGL(896,0x7fff79c93960)malloc:***オブジェクトのエラー*** 0x100151a98:解放されたオブジェクトのチェックサムが正しくありません - オブジェクトはおそらく解放された後に変更されました。 *** malloc_error_breakにブレークポイントを設定してデバッグする ' – hockeyman
@JuliusPetraškaこれはおそらくあなたが' GLVertices'の 'malloc'でも使っているので、頂点配列が小さすぎます。 (この時点ではクラッシュが発生します)。もちろん、 'GLVertices'配列は' vertex count * 2'のサイズを持たなければなりません。各頂点に2つの浮動小数点が含まれているからです。しかし、 'glDrawArrays'に完全な頂点を' [vertices count] 'だけ描かなければなりません。 –