glDrawArrays无法正确绘制

hoc*_*man 7 opengl macos xcode cocoa objective-c

我做了一个绘画程序.一切都按照我的预期运作.但在绘画时,有时会发生一些奇怪的事情.

我运行app,然后在图像上按鼠标左键.它应该从代码中得出点:

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);
Run Code Online (Sandbox Code Playgroud)

在我按下的地方.mouseDown注册mouseDown位置,将其转​​换为NSValue,发送到数组,然后在绘制之前我将NSValue提取到CGPoint并将其发送到GLfloat,以便glDrawArrays可以绘制它.但无论我在图像上单击鼠标,它都会在坐标(0,0)处绘制点.之后,每件事情都可以.见图:

鼠标点击

这是第一个问题.第二个问题是当我用它绘画时(拖动按下的鼠标),有时会出现点未绘制的位置.图片:

鼠标拖动

当我继续拖动它消失.拖动后再次出现并再次消失.等等.图片:

在此输入图像描述

任何想法为什么会发生?我将发布以下代码:


鼠标按下:

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

        [self drawing];
}
Run Code Online (Sandbox Code Playgroud)

拖动鼠标:

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

        [self drawing];
}
Run Code Online (Sandbox Code Playgroud)

画画:

- (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);
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ica 6

您正在设置您的count变量(使用的变量glDrawArrays)[vertices count] * 2,这看起来很奇怪.

最后一个参数glDrawArrays是要绘制的顶点数,而在您的代码中,您似乎将它设置为加倍数(可能您认为它是浮点数?),这意味着您只是在第一个count顶点之后绘制垃圾.