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?
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
'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
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