2012-03-28 8 views
1

Ich verwende eine NSOpenGLView.glDrawArrays (GL_POINTS, 0, VertexCount); Zeichnet nur einen Punkt

- (void)initGL 
{ 
    // Setup OpenGL states 
    [[self openGLContext] makeCurrentContext]; 
    // Setup OpenGL states 
    glMatrixMode(GL_PROJECTION); 
    CGRect frame = self.bounds; 

    // Setup the view port in Pixels 
    glOrtho(0, frame.size.width, 0, frame.size.height, -1, 1); 
    glViewport(0, 0, frame.size.width, frame.size.height); 
    glMatrixMode(GL_MODELVIEW); 

    glDisable(GL_DITHER); 
    glEnable(GL_TEXTURE_2D); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glEnable(GL_BLEND); 

    //glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_POINT_SMOOTH); 

    glEnable(GL_POINT_SPRITE); 
    glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); 

    self.pointSize = pointSizeForDrawing; 
} 

Framebuffer erstellen und binden.

- (BOOL)createFramebuffer 
{ 
    //Generating two buffers 
    glGenRenderbuffers(NumRenderbuffers, renderbuffer); 

    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Color]); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, self.bounds.size.width, self.bounds.size.height); 

    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer[Depth]); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, self.bounds.size.width, self.bounds.size.height); 

    //Generating framebuffer 
    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); 

    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer[Color]); 
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer[Depth]); 
    glEnable(GL_DEPTH_TEST); 

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
    { 
     DLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
     return NO; 
} 

    return YES; 
} 

Linie Rendering

- (void)renderLineFromPoint:(CGPoint)start ToPoint:(CGPoint)end 
{ 
    GLsizei vertexCount = 0; 
    DLog(@"start: %@ end %@", NSStringFromCGPoint(start), NSStringFromCGPoint(end)); 

    // Add points to the buffer so there are drawing points every X pixels 
    int count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y))/brushPixelStep), 1); 
    for(int i = 0; i < count; ++i) 
    { 
     if(vertexCount == vertexMax) 
     { 
      vertexMax = 2 * vertexMax; 
      vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat)); 
     } 

     vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count); 
     vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count); 
     vertexCount += 1; 
    } 

    // Render the vertex array 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); 

    glClear(GL_DEPTH_BUFFER_BIT); 

    glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 

    glDrawArrays(GL_POINTS, 0, vertexCount); 

} 

Und schließlich Puffer angezeigt

- (void)displayBuffer 
{ 
    DLog(@"Display"); 
    glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
    glViewport(0, 0, self.bounds.size.width, self.bounds.size.height); 
    glBlitFramebuffer(0, 0, self.bounds.size.width, self.bounds.size.height, 0, 0, self.bounds.size.width, self.bounds.size.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
    glSwapAPPLE(); 
} 

Es spielt keine Rolle, ob ich Linie glDrawArrays(GL_POINTS, 0, vertexCount);-glDrawArrays(GL_POINTS, 0, 1); ändern. Der Effekt ist immer noch gleich, obwohl der Wert von vertexCount anders als 1 ist. Irgendwelche Ideen?

+0

Holen Sie es, um auszudrucken, was "count" ist, und welche Koordinaten Sie speichern. Die offensichtlichen Probleme sind, dass nur ein Punkt gezogen wird, oder sie werden alle am selben Ort gezeichnet. – cmannett85

+0

'DLog (@" veretxBuffer% f% f ", VertexBuffer [2 * VertexCount + 0], VertexBuffer [2 * VertexCount + 1]);' nach 'VertexBuffer [2 * VertexCount + 1] = Start.y + (Ende .y - start.y) * ((GLfloat) i/(GLfloat) count); 'zeigt, dass die Punkte unterschiedlich sind. Meine Vermutung ist, dass ich mit Zeichnung oder OpenGL-Initialisierung etwas falsch mache, aber nicht weiß, was. – pawelropa

+1

versuchen, glEnable zu entfernen (GL_DEPTH_TEST); es würde nicht richtig funktionieren, aber ich denke, ich habe die ähnliche Situation in Internet gesehen – Gargo

Antwort

1

Erstes mögliches Problem:

glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 

Wie ich verstehe Vertex ist ein Array von Strukturen. Der Fehler könnte also sein, dass der dritte Parameter 0 ist, aber es sollte die Größe dieser Struktur sein. Zum Beispiel:

CVertex3 v[3]; 
... 
glVertexPointer(3,GL_FLOAT,sizeof(CVertex3),v); 

Aktualisiert

Zweites mögliches Problem:

try glEnable (GL_DEPTH_TEST) zu entfernen; es würde nicht richtig funktionieren, aber ich denke, ich habe die ähnliche Situation in Internet gesehen

+0

Kein VertexArray ist kein Array von Strukturen, es ist ein Array von Vertexkoordinaten. Zum Beispiel '[x1, y1, x2, y2, x3, y3, ...]' Meine Vermutung ist, dass ich mit Zeichnung oder OpenGL-Initialisierung etwas falsch mache, aber nicht weiß, was. – pawelropa

+0

Wie Sie sagten, war die Zeile, die das Problem verursachte, 'glEnable (GL_DEPTH_TEST)'. – pawelropa

+0

Ich habe die Antwort bearbeitet. In dem Beispiel, das ich sah, löschten sie glEnable und etwas wurde repariert, aber es funktioniert nicht richtig. Sie sagten, dass sie Müll auf einem Bildschirm gesehen haben. – Gargo

Verwandte Themen