iphone – 如何在背景图像和临时图纸上绘制(如在GLPaint中)?

iphone – 如何在背景图像和临时图纸上绘制(如在GLPaint中)?,第1张

概述我正在为iPad编写一个GLPaint-esque绘图应用程序,但是我遇到了绊脚石.具体来说,我正在尝试实现两件事: 1)可以绘制的背景图像. 2)绘制临时形状的能力,例如你可能画一条线,但最后的形状只会在手指抬起后才会提交. 对于背景图像,我理解的想法是将图像绘制到VBO中并在每个线条绘制之前绘制它.这很好,但现在我需要添加绘制临时形状的能力…将kEAGLDrawablePropertyReta 我正在为iPad编写一个GLPaint-esque绘图应用程序,但是我遇到了绊脚石.具体来说,我正在尝试实现两件事:

1)可以绘制的背景图像.

2)绘制临时形状的能力,例如你可能画一条线,但最后的形状只会在手指抬起后才会提交.

对于背景图像,我理解的想法是将图像绘制到VBO中并在每个线条绘制之前绘制它.这很好,但现在我需要添加绘制临时形状的能力…将kEAGLDrawablePropertyRetainedbacking设置为YES(如在GLPaint中),临时显然不是临时的!将保留的后备属性设置为NO对于临时对象非常有用,但现在我的先前写意线不会被保留.

这里最好的方法是什么?我是否应该使用多个EAGLLayer?我发现的所有文档和教程似乎都表明大多数事情应该可以通过单个层实现.他们还说保留支持应该总是设置为NO.有没有办法在这样的配置中使用我的应用程序?我尝试将每个绘图点存储到一个不断扩展的顶点数组中,以便每帧重绘一次,但是由于绘制的精灵数量太多而无法正常工作.

我真的很感激这方面的任何帮助,因为我在网上搜索并没有发现任何东西!

解决方法 我已经找到了解决这个问题的方法.最好的方法似乎是使用自定义帧缓冲对象和渲染到纹理.在提出问题之前我没有听说过这个问题,但对于OpenGLer的工具包来说,它看起来是一个非常有用的工具!

对于那些可能想要做类似事情的人,我们的想法是创建一个FBO并为其附加纹理(而不是渲染缓冲区).然后你可以绑定这个FBO并像其他任何一样绘制它,唯一的区别是图形是在屏幕外渲染的.然后,您需要做的就是显示纹理是绑定主FBO并将纹理绘制到它(使用四边形).

因此,对于我的实现,我使用了两个不同的FBO,每个都附有纹理 – 一个用于“保留”图像(用于徒手绘图),另一个用于“划痕”图像(用于临时图形).每次渲染帧时,我首先绘制一个背景纹理(在我的例子中我只使用了Texture2D类),然后绘制了保留的纹理,最后绘制了刮痕纹理(如果需要).绘制临时形状时,所有内容都会渲染到临时纹理,并在每帧开始时清除.完成后,将划痕纹理绘制到保留的纹理.

以下是一些可能对某些人有用的代码片段:

1)创建帧缓冲区(我在这里只显示了一对以节省空间!):

// ---------- DEFAulT FRAMEBUFFER ---------- //// Create framebuffer.glGenFramebuffersOES(1,&vIEwFramebuffer);glBindFramebufferOES(GL_FRAMEBUFFER_OES,vIEwFramebuffer);// Create renderbuffer.glGenRenderbuffersOES(1,&vIEWrenderbuffer);glBindRenderbufferOES(GL_RENDERBUFFER_OES,vIEWrenderbuffer);// Get renderbuffer storage and attach to framebuffer.[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:layer];glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,GL_color_ATTACHMENT0_OES,GL_RENDERBUFFER_OES,vIEWrenderbuffer);glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_WIDTH_OES,&backingWIDth);glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_HEIGHT_OES,&backingHeight);// Check for completeness.status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);if (status != GL_FRAMEBUFFER_COMPLETE_OES) {    NSLog(@"Failed to make complete framebuffer object %x",status);    return NO;}// Unbind framebuffer.glBindFramebufferOES(GL_FRAMEBUFFER_OES,0);// ---------- RETAINED FRAMEBUFFER ---------- //// Create framebuffer.glGenFramebuffersOES(1,&retainedFramebuffer);glBindFramebufferOES(GL_FRAMEBUFFER_OES,retainedFramebuffer);// Create the texture.glcolor4f(0.0f,0.0f,0.0f);glGenTextures(1,&retainedTexture);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D,retainedTexture);glTexImage2D(GL_TEXTURE_2D,GL_RGBA,1024,GL_UNSIGNED_BYTE,NulL);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_liNEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_liNEAR);glBindTexture(GL_TEXTURE_2D,0);// Attach the texture as a renderbuffer.glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES,GL_TEXTURE_2D,retainedTexture,0);// Check for completeness.status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);if (status != GL_FRAMEBUFFER_COMPLETE_OES) {    NSLog(@"Failed to make complete framebuffer object %x",0);

2)绘制到渲染到纹理的FBO:

// Ensure that we are drawing to the current context.[EAGLContext setCurrentContext:context];glBindFramebufferOES(GL_FRAMEBUFFER_OES,retainedFramebuffer);glVIEwport(0,1024);// DRAWING CODE HERE

3)将各种纹理渲染到主FBO,并呈现:

glBindFramebufferOES(GL_FRAMEBUFFER_OES,vIEwFramebuffer);glVIEwport(0,backingWIDth,backingHeight);glClearcolor(1.0f,1.0f,1.0f);       // Clear to white.glClear(GL_color_BUFFER_BIT);glEnableClIEntState(GL_VERTEX_ARRAY);glEnableClIEntState(GL_TEXTURE_COORD_ARRAY);[self drawBackgroundTexture];[self drawRetainedTexture];[self drawScratchTexture];gldisableClIEntState(GL_VERTEX_ARRAY);gldisableClIEntState(GL_TEXTURE_COORD_ARRAY);glBindRenderbufferOES(GL_RENDERBUFFER_OES,vIEWrenderbuffer);[context presentRenderbuffer:GL_RENDERBUFFER_OES];

例如,使用[self drawRetainedTexture]绘制保留纹理的绘图将使用以下代码:

// Bind the texture.glBindTexture(GL_TEXTURE_2D,retainedTexture);// Destination coords.GLfloat retainedVertices[] = {    0.0,backingHeight,0.0,0.0};// Source coords.GLfloat retainedTexCoords[] = {    0.0,1.0,0.0};// Draw the texture.glVertexPointer(3,GL_float,retainedVertices);glTexCoordPointer(2,retainedTexCoords);glDrawArrays(GL_TRIANGLE_STRIP,4);// Unbind the texture.glBindTexture(GL_TEXTURE_2D,0);

很多代码,但我希望能帮到别人.它肯定让我难过了一会儿!

总结

以上是内存溢出为你收集整理的iphone – 如何在背景图像和临时图纸上绘制(如在GLPaint中)?全部内容,希望文章能够帮你解决iphone – 如何在背景图像和临时图纸上绘制(如在GLPaint中)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1081288.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存