标签: eaglcontext

可以在OpenGL ES中的EAGLContexts之间共享顶点数组对象(VAO)吗?

剧透:我对答案很有信心NO,但这只是经过一天非常沮丧的调试之后.现在我想知道是否确实如此(如果是这样,我可能知道的话),或者我是否只是做了一些完全错误的事情.

这是情况.我正在使用OpenGL ES 2.0来渲染我从各种文件(.obj,.md2等)加载的一些网格物体.为了性能和用户体验,我使用GCD将这些网格及其相关纹理的实际加载委托给后台线程.

根据Apple的 说明,在每个后台线程上,我创建并设置一个与shareGroup主渲染上下文相同的新EAGLContext .这允许在后台线程上创建的OpenGL对象(如纹理和缓冲区对象)立即被主线程上下文使用.

这一直在努力.现在,我最近了解到顶点数组对象是一种缓存与渲染某些缓冲区内容相关的OpenGL状态的方法.它看起来不错,并减少了样板状态检查和设置渲染每个网格所需的代码.最重要的是,Apple还建议在他们使用顶点数据最佳实践指南中使用它们.

但是我在让VAO为我工作时遇到了严重的问题.就像我对所有加载一样,我会将网格从文件加载到后台线程的内存中,然后生成所有关联的OpenGL对象.没有失败,我第一次尝试glDrawElements()使用VAO 调用时,应用程序崩溃了EXC_BAD_ACCESS.没有VAO,它就会很好.

调试EXC_BAD_ACCESS是一种痛苦,特别是当NSZombies无法帮助时(他们显然不会这样做),但经过一段时间分析捕获的OpenGL帧后,我意识到,虽然在后台线程上创建VAO很顺利(不GL_ERROR,当一个时间来到主线程上的VAO时,我会得到一个GL_INVALID_OPERATION,当尝试绑定到一个不存在的VAO时,文档状态会发生.果然,看着在渲染时当前上下文中的所有对象的时候,没有一个单一的VAO待观察,但都与VAO生成的维也纳各组织在同一时间存在.如果我在主线程上加载VAO它可以正常工作.很沮丧.

我将加载代码提炼为更原子的形式:

- (void)generate {

    glGenVertexArraysOES(1, &_vao);
    glBindVertexArrayOES(_vao);

    _vbos = malloc(sizeof(GLuint) * 4);
    glGenBuffers(4, vbos);
}
Run Code Online (Sandbox Code Playgroud)

当在后台线程上执行上述操作时,如果有效EAGLContextshareGroup主上下文相同,则主上下文将有4个VBO,但没有VAO.如果我在主线程上执行它,使用主上下文,它将有4个VBO和VAO.这使我得出结论,EAGLContext在处理VAO时,s 的对象共享性质存在一些奇怪的例外.如果确实如此,我真的希望Apple文档能够在某处注明.不得不手动发现这样的小花絮是非常不方便的.是这样的,还是我错过了什么?

multithreading opengl-es objective-c eaglcontext ios

19
推荐指数
1
解决办法
2527
查看次数

- [EAGLContext renderbufferStorage:fromDrawable:]第二次失败?

我正在开发一个iOS openGL ES应用程序.

我正在做通常的EAGLView/ES2Render.

在启动时,使用以下代码创建frambuffer成功:

- (BOOL) createFramebuffers
{
    [EAGLContext setCurrentContext:_mainContext];

    // [ A ] On-screen  

    // 1. Framebuffer
    glGenFramebuffers(1, &_mainFramebuffer);
    bindFramebuffer(_mainFramebuffer);

    // 2. Color buffer
    glGenRenderbuffers(1, &_mainColorbuffer);
    bindRenderbuffer(_mainColorbuffer);

    // Adjust size to view's layer:
    CAEAGLLayer* layer = (CAEAGLLayer*)[_view layer];

    if (![_mainContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]) {
        // something went horribly wrong
        NSLog(@"-[ES2Renderer createFramebuffers]: Failed to obtain renderbuffer storage from layer!");
        return NO;
    }

    // Query new size:
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &_backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);

    // Attach to color:
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _mainColorbuffer); …
Run Code Online (Sandbox Code Playgroud)

framebuffer eaglcontext ios opengl-es-2.0

8
推荐指数
1
解决办法
5070
查看次数

绘制时GLKView为空白

我正在尝试使用GLKView将图像放入UITableViewCell来绘制图像.

我在故事板中有一个原型单元,我有一个GLKView.它没有选中Enable setNeedsDisplay.

原型单元有一个名为PhotoTableViewCell的自定义类

import UIKit
import GLKit

class PhotoTableViewCell: UITableViewCell {

  var eaglContext:EAGLContext!
  var ciContext:CIContext!
  var myImage:CIImage!

  @IBOutlet weak var photoGlView: GLKView!
  @IBOutlet weak var timeLabel: UILabel!
  @IBOutlet weak var cameraLabel: UILabel!
  @IBOutlet weak var notesLabel: UILabel!

  override func layoutSubviews() {
     self.photoGlView.delegate = self
 }

}

 extension PhotoTableViewCell: GLKViewDelegate {
   override func draw(_ rect: CGRect) {
       let drawableRectSize = CGSize(width: 200, height: 200)// width:   photoGlView.drawableWidth, height: photoGlView.drawableHeight)

      let drawableRect = CGRect(origin: CGPoint.zero, size: drawableRectSize)
      print("rect ->\(drawableRect)")
      print("rect size -> …
Run Code Online (Sandbox Code Playgroud)

xcode uitableview eaglcontext ios glkview

7
推荐指数
1
解决办法
491
查看次数

CoreImage:EAGLContext帧缓冲区或渲染缓冲区配置不正确

当我使用CoreImage设置GLKViewController/GLKView进行绘图时,我有时会在标题中看到通知.

设置如下所示:

_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

self.view.context = _context;
self.view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
self.view.backgroundColor = UIColor.blackColor;
self.view.contentScaleFactor = UIScreen.mainScreen.scale;

glGenRenderbuffers(1, &_render_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, _render_buffer);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

_core_image_context = [CIContext contextWithEAGLContext: _context];

[EAGLContext setCurrentContext:_context];
Run Code Online (Sandbox Code Playgroud)

我在GLKView中有UIKit子视图,似乎当我添加/删除视图时,它会以某种方式暂时使上下文无效.事情是(除了在极少数情况下我仍然需要转弯)我可以在上下文中绘制的下一个更新没有麻烦.

如果它失败了我可以重试绘图,但我怎么知道上下文无效?我该如何检测它或防止它被无效?

opengl-es core-image eaglcontext ios5

6
推荐指数
1
解决办法
922
查看次数

Opengl Renderbuffer纹理touchmove ios问题

我正在使用OpenGL并使用GLPaint的示例.我创建了一个应用程序,当用户触摸图像时,它会在图像(纹理)上应用旋转.我有一个问题,我需要保存第一次触摸,然后应用下一阶段,等等.但是在下一次触摸时,先前应用的效果将被删除.
我曾尝试使用深度缓冲区和帧缓冲区,但未能获得所需的结果.我附上了我的所有代码和着色器

#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>
#import <GLKit/GLKit.h>

#import "PaintingView.h"

enum {
    ATTRIB_VERTEX,
    NUM_ATTRIBS
};

@interface PaintingView()
{
    // The pixel dimensions of the backbuffer
    GLint backingWidth;
    GLint backingHeight;

    EAGLContext *context;

    // OpenGL names for the renderbuffer and framebuffers used to render to this view
    GLuint viewRenderbuffer, viewFramebuffer, texture;

    // OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist)
    GLuint depthRenderbuffer;


    Boolean needsErase;

    // Shader objects
//    GLuint vertexShader; …
Run Code Online (Sandbox Code Playgroud)

opengl-es touch eaglcontext ios

5
推荐指数
0
解决办法
252
查看次数