glDrawArrays无法正确绘制

时间:2012-07-05 12:47:47

标签: objective-c xcode macos cocoa opengl

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

我运行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);

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

mouse click

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

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];
}

图:

- (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);
}

3 个答案:

答案 0 :(得分:6)

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

glDrawArrays的最后一个参数是要绘制的顶点数,而在你的代码中你似乎将它设置为数字的两倍(也许你认为它是浮点数?),这意味着你是只是在第一个count顶点之后绘制垃圾。

答案 1 :(得分:1)

顶点未在您单击的确切位置渲染的事实应该是一个提示,问题是您没有正确确定视图中的生命点。

您的代码有:

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

告诉视图将点从其坐标(self)转换为相同视图的坐标(self),即使该点实际上是相对于窗口。

要将点从窗口坐标转换为视图,请将该行更改为以下内容:

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

答案 2 :(得分:0)

glDrawArrays的参数定义为(GLenum模式,GLint优先,GLsizei计数)。

第二个参数定义绘制时使用的顶点属性的第一个索引。您传递1作为第一个使顶点坐标不匹配的索引。我假设你想要0。

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