【问题标题】:glDrawArrays not drawing correctlyglDrawArrays 无法正确绘制
【发布时间】:2012-07-05 21:04:00
【问题描述】:

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

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

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) 处绘制点。之后,一切正常。见图片:

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

当我继续拖动时,它会消失。经过一些拖动后,它再次出现并再次消失。等等。图片:

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


鼠标按下:

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

【问题讨论】:

    标签: objective-c xcode macos cocoa opengl


    【解决方案1】:

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

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

    【讨论】:

    • 如果我将其更改为[vertices count],那么当我开始绘图时它会中断。绘制的几个点正常,然后显示错误:Thread 1: EXC_BAD_ACCESS (code=13, adress=0x0)glDrawArrays(GL_POINTS, 0, count);NSValue *locationValue = [NSValue valueWithPoint:vieta]; 错误Thread 1: signal SIGABRT。一次一个错误,一次另一个错误。我不知道为什么,但是错误总是不一样
    • 有时在休息时它会在控制台中显示消息:OGL(896,0x7fff79c93960) malloc: *** error for object 0x100151a98: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug
    • @JuliusPetraška 原因可能是你在malloc 中也使用了GLVertices,所以顶点数组太小,你又一次读取了太多顶点(只是这次导致在崩溃中)。当然GLVertices 数组的大小必须为[vertices count] * 2,因为它包含每个顶点的 2 个浮点数。但是你只需要在glDrawArrays中绘制[vertices count]的完整顶点。
    • 非常感谢我现在不能给你赏金。它说我必须等待 23 小时
    【解决方案2】:

    顶点未在您单击的确切位置呈现的事实应该暗示问题是您没有正确确定视图中的命中点。

    您的代码有:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-05
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多