试图实现OpenGL刷

时间:2012-06-21 07:54:46

标签: objective-c xcode macos cocoa opengl

我正在尝试为mac os实现OpenGL刷。使用GLPaint作为样本。主要的麻烦是GLPaint是iOS应用程序,我需要它在mac os上。不知怎的,我几乎把它编辑成在MAC OS上运行(至少我是这么认为的),但它仍然没有运行。我想,主要问题是'EAGLContext''NSOpenGLContext'或者'OpenGL''OpenGL ES'< / em>差异。当我尝试使用'renderLineFromPoint:ToPoint:'

  • [self renderLineFromPoint:vieta toPoint:buvusVieta];

它在

显示错误
  • `glBindFramebuffer(GL_FRAMEBUFFER,viewFramebufferis);

错误代码

  

主题1:EXC_BAD_ACCSESS(代码= 1,地址= 0x1508)

整个'renderLineFromPoint:toPoint:'代码吼叫

- (void) renderLineFromPoint:(CGPoint)pradzia toPoint:(CGPoint)pabaiga
{
static GLfloat*     vertexBuffer = NULL; 
static NSUInteger   vertexMax = 64;
NSUInteger          vertexCount = 0, count, i;

[context makeCurrentContext];
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebufferis);

//Convert from point to pixel
CGFloat scale = self.contentsScale;
pradzia.x *= scale;
pradzia.y *= scale;
pabaiga.x *= scale;
pabaiga.y *= scale;

//Vertex array buffer
if(vertexBuffer == NULL)
    vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

//Add points to buffer at X pixels
count = MAX(ceilf(sqrtf((pabaiga.x - pradzia.x) * (pabaiga.x - pradzia.x) + (pabaiga.y - pradzia.y) * (pabaiga.y - pradzia.y)) / kBrushPixelStep), 1);
for(i = 0; i < count; ++i) {
    if (vertexCount == vertexMax) {
        vertexMax = 2 * vertexMax;
vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
    }

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

//Render vertex array
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
glDrawArrays(GL_POINTS, 0, vertexCount);

//Show buffer
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbufferis);
[context presentRenderbuffer:GL_RENDERBUFFER];
}

有人可以帮助我吗?

或者也许有人可以指出我类似的示例代码?

即使有人将我链接到教程,在那里解释了实时绘图等事情,这将非常有用。我对鼠标事件跟踪和注册点没有任何问题。我只是需要以某种方式使OpenGL在两点之间画线,或者在每个注册点绘制例如圆。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为你不小心启用了一个断点。只需删除断点或禁用它。

答案 1 :(得分:1)

我解决了我的问题。我只需要使用

  

鼠标按下   的mouseDragged   mouseUp事件

函数注册鼠标事件,然后调用函数[self drawSomething];在女巫写的是绘制和使用坐标巫婆由'mouseDown''mouseDragged''mouseUp'给我。