【问题标题】:Set UIImage as a background for 2D OpenGL ES on iPhone将 UIImage 设置为 iPhone 上 2D OpenGL ES 的背景
【发布时间】:2011-06-22 09:23:31
【问题描述】:

经过大量研究后,我再次寻求帮助。

我需要创建一个视图,用户可以在其中将图像放置在背景上并在其上绘制线条/点(触摸事件),然后按保存按钮保存“草图”。

所以经过研究,我决定拿起this 代码并在其上构建东西,因为它已经完成了我想要的一半(它完成了绘图)。

我的示例是使用OpenGL进行绘图,基本上我不在乎它是OpenGL还是CoreGraphics。

我遇到的问题是如何在此示例代码中将图像作为 EAGLView 的背景。我的研究只给了我对 OpenGL 经验丰富的开发人员的建议,而不是工作代码 sn-p/解决方案。 如果有人可以帮助我,我将不胜感激。

我需要的只是一个如何将 UIImage 放到 EAGLView 背景的示例,以便用户可以在其上绘制(已经有代码)并保存结果。

【问题讨论】:

    标签: iphone objective-c ios opengl-es core-graphics


    【解决方案1】:

    通常不会将 OpenGL 与普通的UI... 视图混合使用。使用 OpenGL 绘制背景图像也很简单:

    首先您需要将图像加载到纹理中。在 GLPaint 中,图像文件被加载为画笔纹理 https://github.com/omeryavuz/glpaint/blob/master/Classes/PaintingView.m函数initWithCoder

    要绘制背景,在清除帧缓冲区后首先绘制的是具有该纹理的全屏四边形。如果你建立在 GLPaint 之上,那么投影和模型视图矩阵以及顶点数组状态已经正确设置。所以归结为

    GLfloat vert[] = {0,0, frame.size.width,0, frame.size.width,frame.size.height, 0,frame.size.height};
    GLfloat tex[] = {0,0, 1,0, 1,1, 0,1};
    GLuint indexes[] = {0, 1, 2, 2, 3, 0};
    
    glBindTexture(GL_TEXTURE_2D, backgroundTexture);
    glEnable(GL_TEXTURE_2D);    
    
    glVertexPointer(2, GL_FLOAT, 0, vert);
    glTexCoordPointer(2, GL_FLOAT, 0, tex);
    glDrawElements(GL_TRIANGLES, 2, GL_UNSIGNED_INT, indexes);
    

    【讨论】:

    • 好的,我在哪里获得 GL_QUADS 和 initWithCoder 方法的内部,我的意思是在我使用 BrushImage/brushTexture('if' 语句)之后还是之前?谢谢。
    • 就像我告诉你的,这是清除帧缓冲区后要做的第一件事。因此,在链接的源文件中查找 glClear(...) - 第 306 行。
    • 好的,但在这种情况下,它是在清理完所有内容之后......好的,我会尝试但我仍然不知道从哪里获得 GL_QUADS。抱歉,我的 OpenGL 技能为零,所以我问了一些愚蠢的问题。谢谢。
    • @Alex Bush:你想要背景图片可以互换吗?然后必须单独保存笔触。 OpenGL 没有绘图持久性,它基本上只是一组笔和画笔,用于在操作系统提供给您的画布上绘图。所以如果你想改变背景,你将不得不重绘它上面的所有东西。 GL_QUADS 是一个 OpenGL 令牌;你不必“得到它”。如果你想在 GLPaint 上构建,你必须学习 OpenGL,没有办法只是“挂钩”。
    • 是的,我知道,但我希望只是“上钩”,因为我不需要任何花哨的东西。我已经得到了绘图代码,我想在我自己的图像上执行这个绘图然后保存它(我也有保存代码)。所以这就是为什么我要询问一个有效的代码片段。我现在没有打算/时间学习opengl。附言我知道 GL_QUADS 是一个 OpenGL 令牌,因为我的 Xcode 抱怨它告诉我它不知道它是什么。
    【解决方案2】:

    PaintingView.m的第89行,设置eaglLayer.opaque = NO;

    在您的 viewController 中,将 UIImageView 或其他任何内容放在paintingView 后面。

    注意:这可能会降低性能。

    注意:它最初可能无法正常工作; OpenGL 层可能会在渲染帧之前用某种默认背景颜色覆盖自身。编辑:PaintingView.m 中的第 304 行:尝试将颜色设置为glClearColor(1.0, 1.0, 1.0, 0.0);。我不确定这是否有效,也没有时间对此进行测试。如果它不起作用,请等到 Brad Larson 出现,看到您的问题并完美回答;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      相关资源
      最近更新 更多