Objective c 在react native中呈现打开的gl es视图
我正在尝试在react本机应用程序中呈现opengl es本机组件。目前,我有一个空白屏幕,我希望看到一个使用glClearColor的红色矩形。运行代码时没有错误。 我对objective c还不熟悉,所以有些语法特性我可能弄错了。但到目前为止,我的情况是这样的 我的自定义视图管理器.hObjective 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
#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);
}