Objective c 在react native中呈现打开的gl es视图

Objective c 在react native中呈现打开的gl es视图,objective-c,opengl-es,react-native,Objective C,Opengl Es,React Native,我正在尝试在react本机应用程序中呈现opengl es本机组件。目前,我有一个空白屏幕,我希望看到一个使用glClearColor的红色矩形。运行代码时没有错误。 我对objective c还不熟悉,所以有些语法特性我可能弄错了。但到目前为止,我的情况是这样的 我的自定义视图管理器.h #import "RCTViewManager.h" @interface myCustomViewManager : RCTViewManager @end 我的自定义视图管理器.m #import

我正在尝试在react本机应用程序中呈现opengl es本机组件。目前,我有一个空白屏幕,我希望看到一个使用glClearColor的红色矩形。运行代码时没有错误。 我对objective c还不熟悉,所以有些语法特性我可能弄错了。但到目前为止,我的情况是这样的

我的自定义视图管理器.h

#import "RCTViewManager.h"

@interface myCustomViewManager : RCTViewManager

@end
我的自定义视图管理器.m

#import "myCustomViewManager.h"
#import "myCustomView.h"

#import <UIKit/UIKit.h>

@implementation myCustomViewManager

RCT_EXPORT_MODULE();

- (UIView *)view
{
  myCustomView * v;
  v = [[myCustomView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  return v;
}

@end
#导入“myCustomViewManager.h”
#导入“myCustomView.h”
#进口
@实现myCustomViewManager
RCT_导出_模块();
-(UIView*)视图
{
myCustomView*v;
v=[[myCustomView alloc]initWithFrame:[[UIScreen mainScreen]边界]];
返回v;
}
@结束
我的自定义视图

#import <GLKit/GLKit.h>
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>


@interface myCustomView : GLKView {
  EAGLContext *context;
}

@end
#导入
#进口
#进口
#进口
@接口myCustomView:GLKView{
EAGLContext*上下文;
}
@结束
我的自定义视图

#import "myCustomView.h"
#import <UIKit/UIKit.h>

@implementation myCustomView

+ (Class)layerClass {
  return [CAEAGLLayer class];
}

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];

  if (self) {
    CAEAGLLayer *EAGLLayer = (CAEAGLLayer *) super.layer;
    EAGLLayer.opaque = YES;

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

    if (!context ||  ![EAGLContext setCurrentContext:context]) {
      NSLog(@"No context");
      exit(1);
    }

    GLuint framebuffer, renderbuffer;
    glGenBuffers(1, &framebuffer);
    glGenBuffers(1, &renderbuffer);

    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

    [context renderbufferStorage:GL_FRAMEBUFFER fromDrawable:EAGLLayer];

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);

    glViewport(0, 0, 200, 200);

    [self render];

  }
  return self;
}

- (void)render
{
  glClearColor(1.0, 0.0, 0.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT);

  [context presentRenderbuffer:GL_RENDERBUFFER];
}

@end
#导入“myCustomView.h”
#进口
@实现myCustomView
+(类)层类{
返回[caeaglayer类];
}
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
caeaglayer*eaglayer=(caeaglayer*)super.layer;
EAGLLayer.不透明=是;
context=[[EAGLContext alloc]initWithAPI:keagrenderingapiopengles2];
如果(!context | |![EagleContext setCurrentContext:context]){
NSLog(“无上下文”);
出口(1);
}
GLuint帧缓冲区,renderbuffer;
glGenBuffers(1和帧缓冲区);
glGenBuffers(1和renderbuffer);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glBindRenderbuffer(GL_RENDERBUFFER,RENDERBUFFER);
[context renderbufferStorage:GL_FRAMEBUFFER fromDrawable:EAGLLayer];
glFramebufferRenderbuffer(GL_帧缓冲区、GL_颜色附件0、GL_RENDERBUFFER、RENDERBUFFER);
glViewport(0,0,200,200);
[自我呈现];
}
回归自我;
}
-(无效)渲染
{
glClearColor(1.0,0.0,0.0,1.0);
glClear(GLU颜色缓冲位);
[上下文提示缓冲:GL_RENDERBUFFER];
}
@结束
谁能帮我把这个画出来

谢谢


Adam

代码中的一些调用是错误的。您应该检查一些工作示例

无论如何,以下是需要更改的行:

glGenFramebuffers(1, &framebuffer); // change function
glGenRenderbuffers(1, &renderbuffer); // change function
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer]; // Convert to GL_RENDERBUFFER
但通常这不是一个
GLKView
过程。只需将
UIView
用作父类即可

为了更安全,请尝试执行以下操作:

- (void)initializeBuffers
{
    CAEAGLLayer *layer = (CAEAGLLayer *)self.layer;
    layer.opaque = YES;
    layer.contentsScale = [UIScreen mainScreen].scale;

    GLuint frameBuffer = 0;
    glGenFramebuffers(1, &frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
    self.frameBuffer = frameBuffer;

    GLuint renderBuffer = 0;
    glGenRenderbuffers(1, &renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
    self.renderBuffer = renderBuffer;

    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer);

    GLint bufferSize[2] = {0,0};
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, bufferSize);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, bufferSize+1);
    self.bufferWidth = bufferSize[0];
    self.bufferHeight = bufferSize[1];

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
        NSLog(@"Error creating framebuffer (error %d)", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }

    glViewport(0, 0, self.bufferWidth, self.bufferHeight);
}